我有两个表,一个表存储广告(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
答案 0 :(得分:1)
LEFT JOIN
表示将位于ON
条件左侧的表格上,但全部由id = 1
或id = 2
您可以尝试使用聚合函数MIN
或MAX 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 |
答案 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