php - 带有 UNION 的限制性 WHERE IN SQL 语句

标签 php mysql sql laravel

我有下表:

  • 卡片
  • 上传
  • 标签
  • tag_upload:标签和上传之间的关系。
  • card_tag:标签和卡片之间的关系。

卡 1 与标签“事件”、“rmc”和“病人”相关。

上传 1 与标签“事件”和“患者”相关。

上传 2 与标签“event”、“rmc”和“病人”相关。

查询 1:

我选择了标签“事件”和“患者”。

它应该返回 Upload 1、Upload 2 和 Card 1。

查询 2:

我选择了标签“事件”、“rmc”和“患者”。

它应该返回 Upload 1 和 Card 1。

问题:

我当前正在使用以下命令,但当我执行此操作时,查询 2 返回与查询 1 相同的结果:

如果卡片中有标签,那么选择卡片的查询会是什么样子? 我可以看一下您可能使用的示例或逻辑流程吗?

这是我的第一个版本,试图得到我想要的东西。使用 PHPSpec 后将立即转换为可测试的代码。

解决方案

谢谢蛋蛋!

SELECT *
FROM(
    SELECT   cards.id, cards.name, cards.type,
             cards.updated_at, cards.created_at, cards.image
    FROM     cards
        JOIN card_tag ON card_tag.card_id = cards.id
        JOIN tags     ON card_tag.tag_id  =  tags.id
    WHERE    NOT tags.deleted
         AND cards.type NOT IN ('','libraries')
         AND cards.account_user_id = 1
         AND tags.name IN ('rmc', 'test')
    GROUP BY cards.id
    HAVING   COUNT(DISTINCT tags.id) = 1
UNION ALL
    SELECT   uploads.id, uploads.name, uploads.type,
             uploads.updated_at, uploads.created_at, uploads.image
    FROM     uploads
        JOIN tag_upload ON tag_upload.upload_id = uploads.id
        JOIN tags     ON tag_upload.tag_id  =  tags.id
    WHERE    NOT tags.deleted
         AND uploads.type NOT IN ('','libraries')
         AND uploads.account_user_id = 1
         AND tags.name IN ('rmc','test')
    GROUP BY uploads.id
    HAVING   COUNT(DISTINCT tags.id) = 2
) AS qry
    ORDER BY `updated_at` DESC
    LIMIT 0, 35

最佳答案

作为起点,考虑加入表格、分组和过滤结果:

SELECT   cards.id, cards.name, cards.type,
         cards.updated_at, cards.created_at, cards.image
FROM     cards
    JOIN card_tag ON card_tag.card_id = cards.id
    JOIN tags     ON card_tag.tag_id  =  tags.id
WHERE    NOT deleted
     AND cards.type NOT IN ('','libraries')
     AND cards.account_user_id = ?
     AND tags.name IN ('event','patient')
GROUP BY cards.id
HAVING   COUNT(DISTINCT tags.id) = 2

如果(card_id, tag_id)保证card_tag中是唯一的,则可以替换COUNT(DISTINCT Tags.id ) 与性能更高的 COUNT(*)

然后可以在 uploads 表上使用类似的查询UNION

关于php - 带有 UNION 的限制性 WHERE IN SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23206463/

相关文章:

php android spinner - JSONObject 无法转换为 JSONArray

MySQL - 点击统计的表格格式

sql - 为什么在使用 json 数据执行 sql 插入查询后,postgres 表在每一列中都显示 Null?

sql - 在临时公用表表达式中添加自增列

sql - 处理 PostgreSQL 异常的优雅方式?

php - 更多结果 - 更快的查询(在 mysql 中按纬度和经度搜索)

php - 基于注释的 symfony2 表单创建器

php - 德鲁帕尔 6 : form_state values empty on submit

php - SilverStripe 自定义电子邮件表单 - jQuery.ajax 不将变量传递到服务器

php - 如何比较php和sql中的日期?