2013-03-25 118 views
84

我读了很多关于只获取左连接的第一行的线程,但由于某种原因,这对我不起作用。LEFT JOIN只有第一行

这是我的结构(简化当然)

订阅

id | title | content 
---------------------- 
1 | Feed 1 | ... 

艺术家

artist_id | artist_name 
----------------------- 
1   | Artist 1 
2   | Artist 2 

feeds_artists

rel_id | artist_id | feed_id 
---------------------------- 
1  |  1  | 1 
2  |  2  | 1 
... 

现在我想要得到的文章,并加入只有第一个艺术家,我想的是这样的:

SELECT * 
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
     SELECT feeds_artists.feed_id FROM feeds_artists 
     WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1 
    ) 
WHERE feeds.id = '13815' 

只是为了让只有feeds_artists的第一行,但已经这样不起作用。

我不能使用TOP,因为我的数据库,我可以为我不需要按feeds_artists.artist_id结果按日期对它们进行排序(我通过编组他们这样得到的结果,但结果不何处最新)

尝试了一些与外部应用 - 以及没有成功。 说实话,我真的不能想象在这些行中发生了什么 - 可能是我无法得到这个工作的最大原因。

SOLUTION:

SELECT * 
FROM feeds f 
LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id 
    LIMIT 1 
) 
WHERE f.id = '13815' 
+0

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – Sinux 2016-06-21 03:12:12

+0

这里是解决方案https://stackoverflow.com/a/7588442/612987 – 2018-01-13 16:40:31

回答

68

如果你可以假设,艺术家ID的增量随着时间的推移,那么MIN(artist_id)将是最早的。

所以尝试这样的事情(未经测试...)

SELECT * 
    FROM feeds f 
    LEFT JOIN artists a ON a.artist_id = (
    SELECT 
     MIN(fa.artist_id) a_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.feed_id 
) a 
+0

感谢您的快速响应。这不是确切的答案,但完全让我走上了正确的道路。我一直试图在同一层面上加入,而不是让另一个依赖于另一个。非常感谢您带领我走上正轨。编辑第一篇文章 – KddC 2013-03-25 23:39:33

+0

@KddC而不是修改问题以添加答案,编辑此答案或自己做答案。 – PhoneixS 2015-08-12 11:47:13

+3

不会在这一个简单的子查询会更好吗?因为现在你有一个连接和一个子查询。只是问起因为我正在寻找解决同样的问题:) – galdikas 2016-02-11 10:36:33

46

版本无子查询:

SELECT f.title, 
      f.content, 
      MIN(a.artist_name) artist_name 
    FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
+1

我认为这应该是被接受的答案 – Binod 2016-04-23 10:11:22

+2

我不认为这将是第一行(第一个id或其他第一个),它只是从左连接行中随机选择一个。 – Sinux 2016-06-21 03:04:22

+15

此查询是错误的。它将选择“最低”艺术家姓名而不是集合中第一批艺术家的姓名。 – Glapa 2016-08-12 16:54:00

3

版本没有子查询将加入只有第一作者:

SELECT f.title, 
     f.content, 
     a.artist_name artist_name, 
     min(a.id) as m 
FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
HAVING a.id = m; 
+0

这与Denis的回应有同样的问题 - 你会得到一个随机的行加入,而不是第一个。 – Ether 2016-09-14 20:16:12

+0

@Ether不,它没有相同的问题。最后我有'HAVING'。 – Glapa 2016-11-22 16:38:14

+2

@Glapa,但当'feeds_artists'已被聚合时'HAVING'应用于'GROUP BY'后面。 – 2016-12-07 13:38:11

0

我使用过别的东西(我认为更好...)并且想分享它:

我创建了一个具有至少一个“组”条款

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code 

SELECT * FROM client INNER JOIN vCountries on client_province = province_id 

我想还没有说,我认为我们需要的,因为我们做错了什么事在分析中做到这一点的解决方案......一个VIEW在我的情况下...但有时这样做更便宜,重新设计一切...

我希望它有帮助!