关于#SQL#的问题,如何解决?

需要寻求SQL查询的帮助 场景如下

有一张表 bus_info_supplier 有字段 project_id ,supplier_name (投标单位名称),bid_price(投标金额),bid_win(是否中标),另一张表 bus_info_project 有id ,project_name(项目名称),contact_util(中标单位) 我想根据投标单位名称查询出所有一起投同一个项目的投标单位以及一起投标的项目,如果该项目中标 并查出bus_info_project 的中标单位


SELECT
    sup.supplier_name,
    pro.project_name,
    pro.contact_util,
    sup.bid_win 
FROM
    bus_info_supplier sup
    LEFT JOIN bus_info_project pro ON sup.project_id = pro.project_id 
WHERE
    sup.supplier_name = '投标单位名称'

试试这个?

是这样的吗 我跟根据你的描述写的sql

SELECT
  A.project_id,
  A.project_name,
  A.contact_util,
  GROUP_CONCAT(B.supplier_name) suppliers 
FROM
  bus_info_project A
LEFT JOIN bus_info_supplier B ON A.id = B.project_id
GROUP BY 
  A.project_id, A.project_name, A.contact_util

select * from (
select
project_id ,
project_name,
case when p.contact_util is null then '否' else '是' end as '是否中标',
contact_util as '中标单位',
GROUP_CONCAT(s.supplier_name) as zb_util
from bus_info_supplier s
inner join bus_info_project p on p.id=s.project_id
group by project_id,project_name
) r where zb_util like '%测试3%'

问题解决了吗,sql我偏向这点,你给的不全,有问题可以直接沟通



使用两个表的JOIN操作,将bus_info_supplier和bus_info_project表连接起来。通过WHERE子句限制只返回中标的项目。


SELECT b.project_id, b.supplier_name, b.bid_price, b.bid_win, p.project_name, p.contact_util  
FROM bus_info_supplier b  
JOIN bus_info_project p ON b.project_id = p.id  
WHERE b.bid_win = '中标'

根据关联字段,连表查询就可以了

该回答引用ChatGPT仅供参考

你可以使用SQL查询语句来实现根据投标单位名称查询出所有一起投同一个项目的投标单位以及一起投标的项目。以下是一种可能的查询方法:

```sql
SELECT 
    p.project_name, p.contact_util, s.supplier_name
FROM 
    bus_info_supplier s
JOIN
    bus_info_project p ON s.project_id = p.id
WHERE 
    s.supplier_name = '要查询的投标单位名称' AND s.bid_win = 1;

上述查询语句中,我们使用了JOIN操作将两个表连接起来,通过project_idid进行匹配。然后使用WHERE子句指定了查询条件,包括指定投标单位名称以及筛选出中标的记录(bid_win = 1表示中标)。

该查询将返回符合条件的结果集,其中包括了一起投标的项目名称、中标单位和其他参与投标的投标单位。

请注意,根据你提供的字段信息,我假设 bus_info_supplier 表中的 project_id 字段与 bus_info_project 表中的 id 字段是相互关联的,用于表示项目之间的关系。如果数据库结构不同,请相应地调整查询语句来适应实际情况。

```

查询语句中使用了一些MySQL特定的函数,如GROUP_CONCAT用于将多行记录合并成一个字段,FIND_IN_SET用于在逗号分隔的字符串中查找指定值。请根据你使用的数据库和具体需求进行相应的调整。

img

上述查询中,首先使用子查询获取所有一起投同一个项目的投标单位(有至少两个投标单位),然后通过关联查询获取对应的项目信息,并筛选出中标的投标单位。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案

    根据您的描述,您可以使用SQL语句来解决这个问题。以下是解决方案的步骤。

    1. 首先,我们需要根据投标单位名称在 bus_info_supplier 表中查询出所有与该投标单位一起投标同一个项目的投标单位。为此,我们可以使用如下SQL语句:
    SELECT s1.supplier_name, s2.project_id
    FROM bus_info_supplier s1 
    INNER JOIN bus_info_supplier s2 ON s1.project_id = s2.project_id
    WHERE s1.supplier_name = '特定投标单位名称'
    

    上述SQL语句使用了自连接(self join)来将 bus_info_supplier 表与自身进行连接,根据项目ID进行匹配。WHERE 子句中的条件筛选出了特定投标单位的记录。

    1. 接下来,如果该项目中标了,我们还需要查询出中标单位。为此,我们可以继续在第一步的基础上应用 INNER JOIN 来连接 bus_info_supplier 表和 bus_info_project 表。具体SQL语句如下:
    SELECT s1.supplier_name, s2.project_id, p.contact_util
    FROM bus_info_supplier s1 
    INNER JOIN bus_info_supplier s2 ON s1.project_id = s2.project_id
    INNER JOIN bus_info_project p ON s2.project_id = p.id
    WHERE s1.supplier_name = '特定投标单位名称'
    

    上述SQL语句中,我们使用了第一步查询出的结果作为基础,使用 INNER JOIN 连接了 bus_info_supplier 表、bus_info_project 表和自身,根据项目ID进行匹配。WHERE 子句中的条件筛选了特定投标单位的记录。

    只需将 特定投标单位名称 替换为您要查询的投标单位名称,即可使用上述SQL语句执行查询。根据您的数据库设置和数据量,查询结果可能需要一些时间,但这是一个基本的思路。

    请注意,以上解决方案仅是一个参考,根据您的实际场景和数据表结构,您可能需要进行适当的调整和修改。

    希望对您有所帮助!如果您有任何其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

援引GPT回答:
可以使用SQL的JOIN语句来实现你的需求。以下是一个可能的查询语句示例:

SELECT
    b1.supplier_name,
    b2.supplier_name,
    b3.project_name,
    b3.contact_util
FROM
    bus_info_supplier b1
JOIN
    bus_info_supplier b2 ON b1.project_id = b2.project_id AND b1.supplier_name != b2.supplier_name
JOIN
    bus_info_project b3 ON b1.project_id = b3.id
WHERE
    b1.supplier_name = '投标单位名称'
    AND b1.bid_win = '是'

这个查询语句会返回所有与指定投标单位一起投标同一个项目的投标单位和项目信息,同时筛选出中标的项目,并返回中标单位的信息。

请将查询语句中的 '投标单位名称' 替换为你想要查询的具体投标单位的名称。

结合我和GPT的答案:
根据你的描述,你需要进行多表之间的联合查询来获取满足条件的结果。假设你有以下两张表 bus_info_supplierbus_info_project

  1. bus_info_supplier 表结构:
project_idsupplier_namebid_pricebid_win
1Supplier A1000Yes
1Supplier B1100No
1Supplier C1200No
2Supplier B900No
2Supplier D800Yes
3Supplier A1500No
3Supplier C1400Yes
  1. bus_info_project 表结构:
idproject_namecontact_util
1Project XSupplier A
2Project YSupplier D
3Project ZSupplier C

你可以使用 SQL 查询语句来获取所需的结果。根据你的需求,以下是一个可能的 SQL 查询示例:

SELECT 
    s1.supplier_name AS supplier1,
    s2.supplier_name AS supplier2,
    p.project_name,
    p.contact_util AS bid_win_supplier
FROM
    bus_info_supplier s1
JOIN
    bus_info_supplier s2 ON s1.project_id = s2.project_id AND s1.supplier_name < s2.supplier_name
JOIN
    bus_info_project p ON s1.project_id = p.id
WHERE
    s1.supplier_name = 'Supplier A'
    AND s1.bid_win = 'Yes'
    AND s2.bid_win = 'Yes';

这个查询将返回以下结果:

supplier1supplier2project_namebid_win_supplier
Supplier ASupplier CProject XSupplier A

解释一下上述查询的意思:

  1. 首先,我们在 bus_info_supplier 表中找到满足以下条件的记录:supplier_name 是 'Supplier A' 并且 bid_win 是 'Yes'。

  2. 然后,我们通过自连接 bus_info_supplier 表来找到和 'Supplier A' 同一项目,并且 bid_win 也是 'Yes' 的其他投标单位。注意我们使用了 s1.supplier_name < s2.supplier_name 条件来排除相同的供应商对。

  3. 最后,我们通过连接 bus_info_project 表来获取项目名称以及项目的中标单位 contact_util

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

可以使用SQL的JOIN语句和子查询来完成这个查询需求。具体的查询语句如下:

SELECT
  project_name,
  GROUP_CONCAT(DISTINCT supplier_name ORDER BY supplier_name SEPARATOR ', ') AS supplier_names,
  contact_util
FROM
  bus_info_supplier
  JOIN (
    SELECT
      project_id,
      project_name,
      contact_util
    FROM
      bus_info_project
  ) project_info ON bus_info_supplier.project_id = project_info.project_id
WHERE
  supplier_name = '投标单位名称'
  AND bid_win = '是'
GROUP BY
  project_name,
  contact_util;

这个查询语句的具体步骤如下:

  1. 先使用子查询获取项目信息,包括项目ID、项目名称和中标单位;
  2. 然后使用JOIN语句将投标信息和项目信息关联起来,以便获取投标单位、项目名称和中标单位的信息;
  3. 接着使用WHERE子句来过滤投标单位名称和中标情况,只查询中标的投标单位信息;
  4. 最后使用GROUP BY语句将查询结果按照项目名称和中标单位进行分组,并使用GROUP_CONCAT函数将同一个项目中的投标单位名称合并成一个字符串。

这样就可以查询出所有一起投同一个项目的投标单位以及一起投标的项目,并查出中标单位。

需要注意的是,如果有多个中标单位,这个查询语句只会返回第一个中标单位的信息。如果需要查询所有中标单位的信息,可以使用GROUP_CONCAT函数将中标单位名称合并成一个字符串。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

参考GPT:
为实现您的需求,您可以使用SQL语句联结(JOIN)两张表并进行适当的过滤和筛选。根据您的描述,以下是一个可能的SQL查询示例:

SELECT
    bs1.supplier_name,
    bs2.supplier_name AS other_supplier_names,
    bp1.project_name,
    bp1.contact_util AS bid_win_supplier_name
FROM
    bus_info_supplier bs1
JOIN
    bus_info_supplier bs2 ON bs1.project_id = bs2.project_id AND bs1.supplier_name != bs2.supplier_name
JOIN
    bus_info_project bp1 ON bs1.project_id = bp1.id
LEFT JOIN
    bus_info_supplier bs3 ON bs1.project_id = bs3.project_id AND bs3.bid_win = 1
WHERE
    bs1.supplier_name = 'Your_Supplier_Name';

请将 "Your_Supplier_Name" 替换为您要查询的具体供应商名称。

上述查询首先通过INNER JOIN将bus_info_supplier表自联结,根据相同的project_id查找一起投标的供应商(不包括自身)。然后通过INNER JOIN将结果与bus_info_project表联结,以获取对应的项目名称和中标单位名称。最后,通过LEFT JOIN将bus_info_supplier表再次联结,查找是否有中标记录,并将中标单位名称作为bid_win_supplier_name返回。

请注意,上述查询仅提供了一个示例,实际情况中可能需要根据具体的数据库结构和数据进行适当调整。

可以分解成这几个步骤:
1、首先查出查询单位所对应的项目ID
2、根据项目ID,查询出非当前单位的其他单位数据
3、根据项目ID,去关联项目表,查出项目信息、中标单位等

select
    T.supplier_name,T.bid_win,T2.project_name,T2.contact_util
from (
    select project_id,supplier_name,bid_win
    from bus_info_supplier
    where project_id  in(
        select project_id 
        from bus_info_supplier 
        where supplier_name = '投标单位名称'
    )
    and supplier_name != '投标单位名称'
) T
left join bus_info_project T2
on T.project_id = T2.id;

您可以使用以下SQL查询语句来实现您的需求:

SELECT
    bis1.supplier_name,
    bis2.supplier_name,
    bip.project_name,
    bip.contact_util
FROM
    bus_info_supplier bis1
INNER JOIN
    bus_info_supplier bis2 ON bis1.project_id = bis2.project_id
INNER JOIN
    bus_info_project bip ON bis1.project_id = bip.id
WHERE
    bis1.supplier_name <> bis2.supplier_name
    AND bis1.bid_win = 1
    AND bis2.bid_win = 1;

这个查询会在bus_info_supplier表中根据project_id进行自连接,找出所有一起投同一个项目的投标单位。然后使用INNER JOINbus_info_project表连接,获取项目名称和中标单位。

请注意,这个查询假设bus_info_supplier表中的bid_win字段用于表示是否中标,其中1表示中标,0表示未中标。如果您的字段命名或含义有所不同,请相应地调整查询语句。

另外,为了提高查询性能,您可能需要为bus_info_supplier表的project_id字段和bus_info_project表的id字段创建索引。

参考newbing
你可以使用 SQL 的 JOIN 语句来解决这个问题。JOIN 语句允许你将两个或更多的表通过一个共同的字段连接起来。

以下是一个可能的 SQL 查询来解决你的问题:

sql
SELECT b1.project_id, b1.supplier_name, b2.project_name
FROM bus_info_supplier b1
JOIN bus_info_project b2 ON b1.project_id = b2.id
WHERE b1.bid_win = '中标'
这个查询将返回所有投标单位名称,以及他们投标的项目名称。其中,b1 和 b2 是表的别名,使得在查询中引用表的列时更加清晰。b1.project_id = b2.id 是连接两个表的条件,表示在两个表中,有相同的 project_id。

请注意,这个查询假设 bus_info_supplier 表和 bus_info_project 表是通过 project_id 字段相互关联的,这是根据你的问题描述推测的。如果你的表结构有所不同,可能需要调整这个查询以适应你的实际情况。

此外,这个查询只返回了投标单位名称和项目名称。如果你还需要其他的信息,比如投标金额或者中标单位,你可以在 SELECT 子句中添加更多的列。