我有两个包含以下示例数据的表:
Table 1: `item_name`
| item_id | item_desc |
| 1 | apple |
| 2 | orange |
| 3 | banana |
| 4 | grape |
| 5 | mango |
Table 2: `user_items`
| user_id | item_id |
| 127 | 1 |
| 127 | 2 |
| 127 | 4 |
| 128 | 1 |
| 128 | 5 |
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下查询选择user_id 127和128中的每个item_id以及相应的item_desc:
SELECT IFNULL(COUNT(ui.user_id), 0) AS total, in.item_desc
FROM user_items AS ui
RIGHT OUTER JOIN item_name AS in
ON ui.item_id = in.item_id
WHERE ui.user_id IN (127, 128)
GROUP BY ui.item_id
ORDER BY total DESC
Run Code Online (Sandbox Code Playgroud)
上述查询的结果是:
| total | item_desc |
| 2 | apple |
| 1 | orange |
| 1 | grape |
| 1 | mango |
Run Code Online (Sandbox Code Playgroud)
但是它没有包含item_id 3,banana,我想用RIGHT OUTER JOIN检索它.我希望得到一个看起来像这样的结果:
| total | item_desc |
| 2 | apple |
| 1 | orange |
| 1 | grape |
| 1 | mango |
| 0 | banana |
Run Code Online (Sandbox Code Playgroud)
有没有办法修改查询以最终得到上面的预期结果?感谢您的时间.
您的查询使用count时出现了一点错误.这有效.
select count(ui.item_id) as total, in.item_desc
from item_name `in`
left join user_items ui on ui.item_id = in.item_id
and ui.user_id in (127, 128)
group by
in.item_desc
order by total desc
Run Code Online (Sandbox Code Playgroud)
您的WHERE子句本质上是删除与127 和 128item_name无关的所有记录。user_id
为了解决这个问题,最简单的解决方案是LEFT JOIN从一个item_name表到另一个表并在 上user_items应用 的选择。user_idJOIN
SELECT COUNT(*), itn.item_desc\nFROM item_name AS itn\n LEFT OUTER JOIN user_items AS ui ON ui.item_id = itn.item_id\n AND ui.user_id IN (127, 128)\nGROUP BY\n itn.item_desc\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,虽然这可以写为 a RIGHT OUTER JOIN,但我发现这种连接类型是 counterintu\xc3\xaftive 的,并且建议仅在绝对必要时使用它们。
| 归档时间: |
|
| 查看次数: |
6806 次 |
| 最近记录: |