【问题标题】:MySQL left join where 2nd object is AND isMySQL 左连接,其中第二个对象是 AND 是
【发布时间】:2021-02-11 01:47:36
【问题描述】:

数据库

产品

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(128) | NO   | UNI | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

标签

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| name          | varchar(128) | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

products_tags

+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| product_id | int(11) | NO   | MUL | NULL    |                |
| tag_id     | int(11) | NO   | MUL | NULL    |                |
+------------+---------+------+-----+---------+----------------+

目标

返回被 2+ 个标签标记的 产品,例如“礼物”和“生日”。

它可能看起来像:

SELECT p.name FROM products p
LEFT JOIN products_tags p_t ON p_t.product_id = p.id
LEFT JOIN tags t ON t.id = p_t.tag_id
WHERE <what-is-the-condition?>

缺少可以通过同时存在和生日的标签选择的正确条件。

类似:

WHERE t.name = 'present' AND t.name = 'birthday';

【问题讨论】:

标签: mysql sql count where-clause having-clause


【解决方案1】:

你可以使用group byhaving

SELECT p.name 
FROM products p
INNER JOIN products_tags p_t ON p_t.product_id = p.id
INNER JOIN tags t            ON t.id = p_t.tag_id
WHERE t.tag IN ('present', 'birthday')    -- either one or the other
GROUP BY p.id, p.name
HAVING COUNT(*) = 2                       -- both are present in the group

这假定每个产品没有重复标签。否则,您需要将HAVING 子句更改为:

HAVING COUNT(DISTINCT t.tag) = 2

【讨论】:

    【解决方案2】:

    不需要tags 表。
    products 加入products_tagsgroup by 产品并在HAVING 子句中设置条件:

    SELECT p.id, p.name 
    FROM products p INNER JOIN products_tags p_t 
    ON p_t.product_id = p.id
    GROUP BY p.id, p.name
    HAVING COUNT(*) >= 2
    

    【讨论】:

    • 我会将其标记为答案,因为它允许指定 2+ 个不同的标签。我没有在问题中提到这一点,但这是我的目标,因为我的后端代码会动态选择标签。
    【解决方案3】:

    如果您的查询特定于任何标签,那么 WHERE 是必须的。根据您的期望结果,我认为您的问题不正确。

    SELECT products.name
        FROM  products
        Join products_tags ON products_tags.product_id = products.id
        
        JOIN tags ON tags.id = products_tags.tag_id
        WHERE tags.name = 'present' OR tags.name='birthday' GROUP BY products.name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 2016-11-05
      • 2021-03-10
      相关资源
      最近更新 更多