【问题标题】:I want to find rows where all my tags can be applied我想找到可以应用我的所有标签的行
【发布时间】:2017-04-10 05:14:33
【问题描述】:

我有一张如下表

我想找到一个同时应用 u_t_tag_id - 1 和 2 的 u_t_upload_id。在这种情况下,它是 1,因为 u_t_tag_id - 1 和 2 应用于 u_t_upload_id 1。

有什么简单的查询可以解决这个问题

我上面给出的是一个示例,真正想要的是显示 u_t_upload_id,其中应用了所有给定的 u_t_tag_id。即 1 和 2 是输入示例。

【问题讨论】:

  • 我已将我的代码更新为经过测试且有效的代码。

标签: mysql sql phpmyadmin tags


【解决方案1】:

您可以使用以下查询:

SELECT u_t_upload_id
FROM uploads_tags
WHERE u_t_tag_id IN (1, 2)
GROUP BY u_t_upload_id
HAVING COUNT(DISTINCT u_t_tag_id) = 2

HAVING 子句检查具有 2 个 不同 u_t_tag_id 值的 u_t_upload_id 组。由于WHERE 子句过滤掉了除u_t_tag_id IN (1, 2) 之外的记录,因此查询保证返回与both u_t_tag_id 值相关的那些u_t_upload_id

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT Distinct(u_t_upload_id) FROM table WHERE u_t_upload_id = 1 AND u_t_upload_id = 2
    

    【讨论】:

      【解决方案3】:

      我还在学习关系除法,所以我对下面的代码不是 100% 有信心。但是这里...

      SELECT *
      FROM tblTable AS X
      WHERE NOT EXISTS ( SELECT *
                         FROM tblTable AS Y
                         WHERE Y.u_t_tag_id IN ( 1, 2 )
                           AND NOT EXISTS ( SELECT *
                                            FROM tblTable AS Z
                                            WHERE Z.u_t_upload_id = X.u_t_upload_id
                                              AND Z.u_t_tag_id = Y.u_t_tag_id )
                       )
      ORDER BY u_t_upload_id;
      

      我针对使用以下脚本创建的测试数据库测试了上述代码...

      CREATE DATABASE RelationalDivision002;
      USE RelationalDivision002;
      CREATE TABLE tblTable
      (
          u_t_id          INT,
          u_t_upload_id   INT,
          u_t_tag_id      INT
      );
      INSERT INTO tblTable( u_t_id,
                            u_t_upload_id,
                            u_t_tag_id )
      VALUES ( 1, 1, 1 ),
             ( 2, 1, 2 ),
             ( 3, 2, 3 ),
             ( 4, 3, 4 ),
             ( 5, 3, 5 ),
             ( 6, 3, 6 ),
             ( 7, 2, 1 ),
             ( 7, 3, 1 );
      

      我使用最内层SELECT 的 WHERE 条件的任意组合来测试代码。以上是产生所需输出的唯一方法。

      我几乎想通了。

      如果您有任何问题或cmets,请随时与我联系。

      谢谢。

      【讨论】:

        【解决方案4】:

        我找到了一个简单的查询来解决这个问题

        SELECT u_t_upload_id FROM uploads_tags WHERE (u_t_tag_id=1 OR u_t_tag_id=2) GROUP BY u_t_upload_id HAVING COUNT(*)=2
        

        【讨论】:

        • 此查询还将返回一个与 just one u_t_tag_id 值相关的 u_t_upload_id 值。
        猜你喜欢
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多