[英]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_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 | ... |
+----+--------------+---------------+-----+
您不需要left join
和group 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.