【问题标题】:sql query left join records missingsql查询左连接记录丢失
【发布时间】:2013-09-01 07:53:31
【问题描述】:
SELECT 
    a.customers_id, b.name, b.office, b.username, a.serial_number, a.id
FROM 
    user_assets AS a
left JOIN 
    customers AS b ON 
        a.customers_id = b.id 
WHERE NOT 
        (b.username LIKE 'Warehouse') 
    AND (serial_number LIKE 'R8%' 
        OR serial_number LIKE 'LR%' 
        OR serial_number LIKE 'R9%')
GROUP BY
    a.customers_id
HAVING (COUNT(a.customers_id) >=2);

查询应该找出哪些用户拥有多台计算机。但是每个用户只显示一条记录,如何显示 serial_number 列中的所有关联行?

编辑

删除了and a.customers_id = a.customers_id,因为这是我正在尝试的事情,而$by 作为这个问题不需要

【问题讨论】:

  • 你为什么把a.customers_id = a.customers_id这个条件放在JOIN条件中?
  • a.customers_id = a.customers_idON 子句中的作用是什么?
  • 我删除了那部分,我正在尝试一些东西,但在发布之前忘记删除它
  • 您愿意展示一些示例输出吗?

标签: php sql join


【解决方案1】:

您不需要left joingroup by,但需要在 where 子句中使用子查询进行简单内连接:

select b.customers_id, b.name, b.office, b.username, a.serial_number, a.id
from user_assets a, customers b 
WHERE a.customers_id = b.id 
  and b.username != 'Warehouse' 
  and (serial_number LIKE 'R8%' or serial_number LIKE 'LR%' or serial_number LIKE 'R9%')
  and (select count(1) from user_assets a1 
       where a1.customers_id=b.id
       and (serial_number LIKE 'R8%' or serial_number LIKE 'LR%' or serial_number LIKE 'R9%')  
      ) >= 2

您还应该考虑创建和使用目录表asset_types 而不是这样的like - 序列号谓词。总的来说,这会更有效,也是更好的做法。

【讨论】:

  • 非常感谢,这正是我所需要的。出于某种原因,尽管它在类似条件之外的返回结果,例如,现在出现了具有序列号以 r8、r9 或 lr 以外的其他内容开头的资产的用户
  • 也许您也应该在内部查询中包含相同的类似谓词?这样的序列号是否意味着资产是计算机?
  • 我试试看。额外的结果是拥有多个资产的用户,但额外的资产不是计算机,所以我想从结果中排除这些。我想显示拥有多个资产的用户,但前提是所有资产都有以 r8、r9 和 lr 开头的序列
【解决方案2】:

GROUP BY 的使用——顾名思义——对结果进行分组(在您的情况下为user_assets'customer_id)。省略GROUP BY,它应该返回符合您条件的每条记录。

我猜您真正想要的是一种按各自客户对记录进行分组的方法。您应该使用ORDER BY a.customer_id,然后在您的应用程序逻辑中处理记录。

编辑一个可行的例子是:

SELECT a.id,
       a.customers_id,           
       a.serial_number,
       b.name,
       b.office,
       b.username
  FROM user_assets AS a
  LEFT JOIN customers AS b
    ON a.customers_id = b.id 
 WHERE b.username != 'Warehouse'
   AND ( a.serial_number LIKE 'R8%'
    OR a.serial_number LIKE 'LR%'
    OR a.serial_number LIKE 'R9%' )
 ORDER BY a.customer_id

示例输出:

+----+--------------+---------------+-----+
| id | customers_id | serial_number | ... |
+----+--------------+---------------+-----+
|  3 |           11 | R8-xyz        | ... |
|  4 |           13 | R9-abc        | ... |
|  5 |           13 | R8-xyz        | ... |
|  6 |           13 | LR-abc        | ... |
| .. |           .. | ...           | ... |
| 37 |           21 | LR-abc        | ... |
| 38 |           21 | LR-def        | ... |
+----+--------------+---------------+-----+

【讨论】:

  • 谢谢,我试过了,但有些问题,一旦我开始工作,它返回的结果比以前更少
  • 一旦你删除了GROUP BY,你也必须删除HAVING CLAUSE
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 2021-12-25
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2014-06-04
相关资源
最近更新 更多