0

我有 3 个表格:图像、颜色和标签。每个图像有 2 种颜色和至少 1 个标签。我希望我的用户单独搜索标签或/和颜色。

问题是当我加入表时,我得到的行在列中多次具有相同的值。

SELECT images.id, tag, color
FROM images
JOIN tags ON tags.image_id = images.id
JOIN colors ON colors.image_id = images.id
WHERE images.id = 1

I get:
image_id: 1, tag: sky, color: blue
image_id: 1, tag: cloud, color: blue
image_id: 1, tag: sky, color: white
image_id: 1, tag: cloud, color: white

But the result I want is something like:
image_id: 1, tag1: sky, tag2: cloud, color1: blue, color2: white

这有可能吗?还是我应该改变数据库设计?

4

1 回答 1

1

该函数group_concat()会将所有标签或颜色值放入一个字段中,使用您喜欢的任何分隔符:

SELECT images.id, group_concat(distinct tag separator ', ') as tags,
       group_concat(distinct color separator ', ') as colors
FROM images
left JOIN tags ON tags.image_id = images.id
left JOIN colors ON colors.image_id = images.id
WHERE images.id = 1
group by images.id

group by严格来说,在这种情况下不需要,因为您要过滤到一组。但您可能希望消除该where子句并查看多个 ID。)

关键字可以防止重复,这distinct很重要,因为您的查询会在标签和颜色之间产生笛卡尔积。如果您有 4 个标签和 3 种颜色,则查询会为每个 id 生成 4*3=12 行。我确实将联接更改为左外部联接,因此您会看到缺少标签或缺少颜色的 id。

您实际上请求 1tag1 ,tag2 ,color1 , andcolor2` 作为输出。好吧,如果最多有两个值,那么您很幸运:

SELECT images.id,
       min(tag) as tag1, max(tag) as tag2,
       min(color) as color1, max(color) as color2
FROM images
left JOIN tags ON tags.image_id = images.id
left JOIN colors ON colors.image_id = images.id
WHERE images.id = 1
group by images.id

使用更多颜色或标签时,您会遇到问题。SQL 查询具有固定数量的列——也就是说,您不能仅仅因为在 id 上添加了新颜色就添加另一列。此外,在 MySQL 中,很难枚举事物(可能,但不是标准 SQL)。如果您有两种以上的颜色或标签,请使用group_concat().

于 2013-04-26T19:32:01.113 回答