从LEFT JOIN只检索一条记录

时间:2018-11-10 02:48:06

标签: sql join group-by aggregate-functions

我有两个表,一个表存储广告(ads),另一个表存储图像(images)。 images中每个ads中的每个记录通常包含一个以上的图像。

ads

+------------+------------+
|ad_id       |title       |
+------------+------------+
|1           |sample1     |
+------------+------------+
|2           |sample2     |
+------------+------------+

images

+------------+------------+
|image_id    |image       |
+------------+------------+
|1           |1.jpg       |
+------------+------------+
|1           |2.jpg       |
+------------+------------+
|2           |3.jpg       |
+------------+------------+

我想做的是制作一个广告列表,其中ads中的每条记录每个图像一张图像,并且当前正在使用以下sql查询。

SELECT a.`title`, i.`image`
FROM ads a
LEFT JOIN `images` i ON i.`id` = a.`id` 

但这会返回三个记录,而不是两个广告,其中包含ads的重复记录,因为images包含两个图像记录。

如何限制广告中每条记录仅一张图片。

任何帮助将不胜感激。 TIA

PS: 当前输出就像

sample1, 1.jpg
sample1, 2.jpg
sample2, 3.jpg

但是我期待

sample1, 1.jpg
sample2, 3.jpg

sample1, 2.jpg
sample2, 3.jpg

3 个答案:

答案 0 :(得分:1)

LEFT JOIN表示将位于ON条件左侧的表格上,但全部由id = 1id = 2

进行匹配

您可以尝试使用聚合函数MINMAX on i.image`列来达到期望。

如果您想获得1.jpg,可以使用MIN,否则请使用MAX

CREATE TABLE ads(
  ad_id INT,
  title VARCHAR(50)
);


INSERT INTO ads VALUES (1,'sample1');
INSERT INTO ads VALUES (2,'sample2');

CREATE TABLE images(
  image_id INT,
  image VARCHAR(50)
);


INSERT INTO images VALUES(1,'1.jpg');
INSERT INTO images VALUES(1,'2.jpg');
INSERT INTO images VALUES(2,'3.jpg');

查询#1

SELECT a.`title`,MIN(i.`image`)
FROM ads a
LEFT JOIN `images` i ON i.`image_id` = a.`ad_id` 
GROUP BY  a.`title`;

| title   | MIN(i.`image`) |
| ------- | -------------- |
| sample1 | 1.jpg          |
| sample2 | 3.jpg          |

this

答案 1 :(得分:1)

最简单的方法可能是相关子查询:

SELECT a.title,
       (SELECT i.image
        FROM image` i 
        WHERE i.id = a.id 
        LIMIT 1
       ) as image
FROM ads a;

这将返回一个任意图片。您可以在子查询中添加ORDER BY以获得特定的图像,例如:

  • ORDER BY rand()获取随机图片
  • ORDER BY i.id获得最小的id
  • ORDER BY i.createDate DESC获取最新的
  • 依此类推

答案 2 :(得分:0)

json

基于基于行号的过滤,此查询每条记录仅显示一张图像。

有关加入的更多信息,请单击此处https://medium.com/@cdaniel7/run-down-of-sql-joins-434d9d03f2d