MySQL JOINS:从子表中选择一行满足条件,否则为NULL

时间:2016-08-13 19:30:13

标签: php mysql join left-join

我正在尝试加入两张桌子,但我遇到了一些麻烦。 这是主表packs

This is the main table

这是第二张表media enter image description here

media用于存储packs的图像。每个包可以有0个或更多图像。当包装有图像时,其中一个将is_default字段设置为1以指示要显示的主图像。

我想获得所有包装和每张图片。如果没有图片,则只需一个简单的NULL,否则会获得is_default的图片。

这是我的查询。

SELECT 
    pack.*,
    ( SELECT media.src FROM packs pack LEFT JOIN packs_media media ON pack.id = media.pack_id WHERE media.is_default = 1 GROUP BY media.id LIMIT 1 ) AS image 
FROM packs pack 
LEFT JOIN packs_media ON media.pack_id = pack.id 
GROUP BY pack.id 
ORDER BY pack.id DESC

我总共有三个包,其中只有一个包含一些图像。 查询返回3个结果。问题是所有三个结果都有相同的image,只有一个应该,而另外两个应该image字段为空/空。

有没有办法只使用一个查询执行此操作?我想避免在循环中查询media表。

谢谢

1 个答案:

答案 0 :(得分:1)

您需要相关的子查询而不是连接:

SELECT p.*,
      (SELECT m.src
       FROM packs_media m
       WHERE p.id = media.p 
       ORDER BY m.is_default DESC, m.id
       LIMIT 1
      ) AS image 
FROM packs p 
ORDER BY p.id DESC;

实际上,根据问题的描述,外部查询中也不需要JOIN。因此,也不需要GROUP BY

请注意ORDER BY子句的更改。这可以保证首先选择默认值。

并且,您的查询为所有行获取相同的值,因为子查询独立于外部查询。因此,始终选择相同的值。