【问题标题】:Select values from two mysql tables从两个mysql表中选择值
【发布时间】:2020-06-13 02:54:29
【问题描述】:

我有两个名为 JobBid 的表。客户可以添加工作详细信息,并且多个供应商可以投标该工作。一旦客户从投标中选择一个供应商,该供应商 ID (sId) 将在Job 表上更新。我想选择具有投标价值的工作细节。

这是我试过的

SELECT job.id,job.title,job.desc,job.mobile,job.address, job.city,job.updatedAt,job.status,bid.value,customer.cName,supplier.sName
FROM job
LEFT JOIN customer 
     ON customer.id = job.cId 
LEFT JOIN supplier 
     ON supplier.id = job.sId
LEFT JOIN bid 
     ON bid.sId = job.sId`

但是这个查询显示了一些重复的混乱信息

job

bid

有两个供应商(sId=2 和 sId=1)竞标第 5 号工作(我已在bid 表上标记)。但客户已为第 5 号工作选择了 sId 2。现在我要选择从那些没有杂乱记录的表中。

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: mysql sql database join select


【解决方案1】:

我认为您只是缺少投标的加入条件,该条件会过滤所选供应商。允许没有供应商的工作同时驱逐客户未选择供应商的工作的逻辑有点棘手,并在WHERE 子句中实现:

SELECT ...
FROM job
INNER JOIN customer 
      ON customer.id = job.cId 
LEFT JOIN supplier 
      ON supplier.id = job.sId
LEFT JOIN bid 
     ON  bid.sId = job.sId 
     AND bid.jId = job.id   --> here
WHERE supplier.id IS NULL OR bid.id IS NOT NULL

【讨论】:

  • @CMB 谢谢。您的查询做得很好。但它没有显示工作编号 8 和 9 的记录。我想显示仍然没有分配给任何供应商的工作(使用 sId null记录)。
  • @Tje123:我想我明白你的意思了。我稍微修改了查询。
【解决方案2】:

在您的选择语句中,您试图从出价表 bid.value 中检索数据,但您没有加入该表。

select j.id,
       j.title,
       j.desc,
       j.mobile,
       j.address,
       j.city,
       j.updatedAt,
       j.status,
       b.value,
       c.cName,
       s.sName
from job as j
         inner join customer as c
                    on j.cId = c.id
         inner join supplier as s
                    on j.sId = s.id
         inner join bid as b
                    on j.id = b.jId;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2014-01-28
    相关资源
    最近更新 更多