【问题标题】:how can add an extra select in this query?如何在此查询中添加额外的选择?
【发布时间】:2010-05-20 23:44:50
【问题描述】:

我有三个相关的表。

图片: 编号 |文件名 |文件大小 | ...

节点: image_id | tag_id

标签: 编号 |名字

我正在使用这个查询来搜索包含 x 标签的图像

SELECT images.* FROM images 
INNER JOIN nodes ON images.id = nodes.image_id 
WHERE tag_id IN (SELECT tags.id FROM tags WHERE tags.tag IN ("tag1","tag2")) 
GROUP BY images.id HAVING COUNT(*)= 2

问题是我还需要检索检索到的图像所包含的所有标签,并且我需要在同一个查询中使用它。

这是搜索图像包含的所有标签的实际查询:

SELECT tag FROM nodes 
JOIN tags ON nodes.tag_id = tags.id 
WHERE image_id = images.id and nodes.private = images.private 
ORDER BY tag

我怎样才能将这两者混合在一起只有一个查询?

我需要结果中的所有图像表以及图像的标签。喜欢: ID 文件名 文件大小 标签

如果可能的话,也许可以连接标签。

【问题讨论】:

  • 您能告诉我们您希望结果集的外观吗?

标签: sql join


【解决方案1】:

大概是这样的吧?

SELECT i.id, t.name
FROM images i
    INNER JOIN nodes n ON n.image_id = i.id
    INNER JOIN tags t ON t.id = n.tag_id
WHERE i.id IN
(
    SELECT nodes.image_id 
    FROM nodes
        INNER JOIN tags ON tags.id = nodes.tag_id
    WHERE tags.name IN ('tag1', 'tag2')
)

【讨论】:

  • 返回所有标签混合:/,而不是那个 x 图像。
  • SQL 中每个查询语句只能得到一个结果集。此示例为您提供了一个结果集,其中包含图像和标签作为(图像 ID,标签名称)对。枚举这些对并在客户端代码中执行必要的分组并不难。如果您希望每个图像有单独的结果集,则必须在 SQL 中使用游标或在客户端代码中使用循环来执行多个查询(每个图像 id 一个)。
【解决方案2】:

还有这个?

SELECT tag FROM nodes 
JOIN tags ON nodes.tag_id = tags.id 
WHERE image_id = images.id 
AND nodes.private = images.private 
AND image_id in (
   SELECT images.id FROM images 
   INNER JOIN nodes ON images.id = nodes.image_id 
   WHERE tag_id IN (SELECT tags.id FROM tags WHERE tags.tag IN ("tag1","tag2")) 
   GROUP BY images.id HAVING COUNT(*)= 2)
ORDER BY tag

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2018-06-25
    • 2013-12-30
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多