MySQL一对多选择

时间:2017-09-27 09:15:46

标签: mysql sql one-to-many

表A(一个表)和表B(多个表)之间有一对多的关系。

我想查询表A,只返回表A中表B中至少有一行的条目。

我认为它可能是一个内连接,但我仍然在表B中为每个条目返回一行。

SELECT * FROM categories.* INNER JOIN images ON images.category_id = categories.id

那是我当前的查询,我认为这是我需要添加的WHERE子句,但我不知道是什么。

我很抱歉这是一个如此简单的问题,我无法自己找到答案,我认为我写错了。

4 个答案:

答案 0 :(得分:2)

要获取表b中至少有一个关联的类别数据(不是图像数据),您可以执行以下操作

SELECT c.* 
FROM categories c
INNER JOIN images i ON i.category_id = c.id
GROUP BY c.id
HAVING COUNT(DISTINCT i.id) > 0

或者没有聚合只是区别并加入

SELECT DISTINCT  c.* 
FROM categories c
INNER JOIN images i ON i.category_id = c.id

答案 1 :(得分:1)

你可以通过多种方式做到。 一个人可能会跟随。它在WHERE条件中使用EXISTS:

SELECT * 
FROM categories
WHERE EXISTS (SELECT 1 FROM images WHERE images.category_id = categories.id)

另一个可以在子查询中使用DISTINCT(但我认为表演比以前更差):

SELECT * 
FROM categories
INNER JOIN (SELECT DISTINCT category_id FROM images) images ON images.category_id = categories.id)

答案 2 :(得分:1)

您可以使用左/右连接。

SELECT * FROM categories.* I
RIGHT JOIN images 
ON images.category_id = categories.id

在你的情况下,我认为表A是类别和表B图像。 如果相反,请尝试使用左连接

https://www.w3schools.com/sql/sql_join_left.asp

答案 3 :(得分:1)

使用此查询

SELECT c.* 
FROM categories c
INNER JOIN images i ON i.category_id = c.id
GROUP BY i.category_id