gpt4 book ai didi

mysql - 返回所有相关 WHERE 匹配的行

转载 作者:行者123 更新时间:2023-11-29 06:21:00 24 4
gpt4 key购买 nike

我需要返回一个匹配多对多关系上所有 WHERE 语句的结果。解释一下:

我有一个这样的表结构。

CREATE TABLE `product` (
`product_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`product_id`));

CREATE TABLE `product_has_tag` (
`product_id` INT UNSIGNED NOT NULL,
`tag_id` INT UNSIGNED NOT NULL
);

CREATE TABLE `tag` (
`tag_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`value` VARCHAR(30) NULL,
PRIMARY KEY (`tag_id`));

现在我有这样的情况:

Product: {
[product_id:1],
[product_id:2],
[product_id:3]};
Tags: {
[tag_id:1, value:'XX'],
[tag_id:2, value:'YY']}
ProductHasTag: {
[product_id:1, tag_id:1],
[product_id:1, tag_id:2],
[product_id:2, tag_id:1],
[product_id:3, tag_id:2]}

基本上,只有一种产品有两个标签,其余只有一个。现在我需要一个 SQL 搜索条件,它将只返回同时具有两个标签的产品。有点像

SELECT * FROM `product` 
LEFT JOIN product_has_tag USING(product_id)
LEFT JOIN tag USING(tag_id)
WHERE value LIKE '%X%' AND value LIKE '%Y%'

这显然不起作用,因为搜索值不在一个标签中,而是在两个标签中。任何帮助表示赞赏。

最佳答案

您只需将 WHERE 更改为 HAVING 并使用 SUM CASE WHEN

SELECT `product`.`product_id`    -- *
FROM `product`
LEFT JOIN product_has_tag
USING(product_id)
LEFT JOIN tag
USING(tag_id)
GROUP BY `product`.`product_id`
HAVING SUM(CASE WHEN `value` LIKE '%X%' THEN 1 END) > 0
AND SUM(CASE WHEN `value` LIKE '%Y%' THEN 1 END) > 0

SqlFiddleDemo

关于mysql - 返回所有相关 WHERE 匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33322029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com