【问题标题】:SQL: To get all tags for a question when one is knownSQL:在已知问题时获取问题的所有标签
【发布时间】:2010-11-20 08:32:34
【问题描述】:

当其中一个标签已知时,如何为问题选择question_idtags?

我正在构建一个标签搜索,它通过一个标签搜索问题,以便结果显示问题及其标签,包括在搜索中使用的标签。

我使用与this question 相同的表。 他们是

表格

questions          |     tags
-------------------|-----------------
  question_id      |     tag
  title            |     question_id
  was_sent_at_time |

查询

    SELECT question_id, tag
    FROM tags
    WHERE question_id IN 
    ( 
        SELECT question_id
        FROM questions
        ORDER BY was_sent_at_time
        DESC LIMIT 50
    )
    AND tag = $1;          // Problem here   

这个查询的问题是它没有显示分配给该问题的其他标签。 如果存在给定的标签,则可以获取 question_id 和标签。

【问题讨论】:

    标签: sql postgresql select join


    【解决方案1】:
        SELECT TOP 50 q.question_id, q.title, t.tag
        FROM tags t
        INNER JOIN questions q
        ON t.question_id = q.question_id
        WHERE q.question_id IN 
        ( 
            SELECT tin.question_id
            FROM tags tin
            WHERE tin.tag = $1
        )
       ORDER BY q.was_sent_at_time DESC
    

    这回答了你的问题(如果我理解正确的话),但我认为你会有太多重复的数据 - 你真的不希望每个标签都重复问题标题。所以你应该把它分成2个结果集:

        SELECT TOP 50 q.question_id, q.title
        FROM questions q
        WHERE q.question_id IN 
        ( 
            SELECT tin.question_id
            FROM tags tin
            WHERE tin.tag = $1
        )
       ORDER BY q.was_sent_at_time DESC
    

    和:

      SELECT t.question_id, t.tag
        FROM tags t
        WHERE t.question_id IN 
        ( 
            /* 
           SAME SQL AS ABOVE WITH SELECT q.question_id, 
           OR SELECT FROM A TEMP TABLE THAT ABOVE WAS SAVED TO
           */
        )
       ORDER BY t.question_id
    

    然后,当您构建页面或其他内容时,您会将它们组合在一起。

    【讨论】:

    • TOP 50 在您的SELECT 查询中的用途是什么?
    • 和sql server中的limit 50一样
    • 我很确定情况正好相反:limit 是 pgsql,top 是 mssql。
    • 似乎用t 重命名表tags 是无关紧要的,类似于tin 子查询中的同一个表。 - 是否是重命名的唯一原因?
    • 我总是在列名前加上表名或别名。如果您有一个简短的别名,这将更加容易和清晰。我做前缀是因为有时不清楚该列属于哪个表。如果有人出现并将相同的列名添加到您查询中使用的另一个表中,它将破坏您的 SQL(不明确的列名错误)。
    【解决方案2】:

    您应该能够在数据库中完成这项工作。你不想在应用层做这件事。

    身份证 |问题 ---|---------- 1 |一只鸭子有多重? 2 |你的性别是什么? 3 |你的鸭子性别是什么? 问题编号 |标签 ------------|-------- 1 |鸭子 2 |性别 3 |鸭子 4 |性别

    请注意,由于您的架构设计,标签名称是重复的

    所以要获得所有关于鸭子的问题(问题 1 和 3),您需要这样做

    SELECT * from tags t
    INNER JOIN questions q on t.question_id = q.question_id
    WHERE
    t.tag = 'Duck'
    ORDER BY was_sent_at_time
    DESC LIMIT 50
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多