繁体   English   中英

sql查询左联接记录丢失

[英]sql query left join records missing

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是该问题的版本

使用GROUP BY顾名思义-将结果分组(在您的情况下为user_assetscustomer_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        | ... |
+----+--------------+---------------+-----+

您不需要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上的序列号-predicates。 总的来说,这将是更有效和更好的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM