[英]MySQL - Select multiple values across multiple columns where all matches have a result
我正在尝试构造一个查询,该查询将允许我对特定条件的成对列进行“过滤”。 我需要能够为同一给定对构造多个过滤器。 最终结果应仅返回具有适用所有过滤器情况下的数据的实例。
我构造了一个简单的示例,演示了我想做的事。
使用下表定义:
DROP TABLE IF EXISTS foo;
CREATE TEMPORARY TABLE `foo` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Index` INT UNSIGNED NOT NULL,
`Header` VARCHAR(50) NOT NULL,
`Value` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID_UNIQUE` (`ID` ASC));
INSERT INTO `foo` (`Index`, `Header`, `Value`)
VALUES
(0, 'Header_1', 'a'),
(0, 'Header_2', 'b'),
(1, 'Header_1', 'a'),
(1, 'Header_2', 'c');
假设您正在寻找'Header_1'=='a'和'header_2'=='b'的情况,我希望查询返回以下内容:
Index | Header | Value
------------------------
0 | Header_1 | a
0 | Header_2 | b
我目前的尝试如下:
SELECT `Index`, `Header`, `Value` FROM `foo`
WHERE (
(`Header` = 'Header_1') AND (`Value` = 'a')
OR (
(`Header` = 'Header_2') AND (`Value` = 'b')
)
)
GROUP BY `Header`, `Value`
HAVING COUNT(DISTINCT `Index`) = 2
ORDER BY `Index`, `Header`;
该代码返回以下内容:
Index | Header | Value
------------------------
0 | Header_1 | a
我缺少我的返回行之一。 如何重组查询以返回所有匹配的行?
请注意,我已将该表声明为临时表。 这很重要,因为我正在使用临时表,并且要牢记一些特殊限制(即在同一条语句中不能多次打开它)。
您的查询仅返回header_1,因为该子句:
HAVING COUNT(DISTINCT `Index`) = 2
仅对Header_1正确。
标头_2的计数为= 1,因此已从最终结果中删除。
为了更清楚地了解我所说的内容,请使用:
SELECT `Index`, `Header`, `Value`, COUNT(DISTINCT `Index`) FROM `foo`
WHERE (
(`Header` = 'Header_1') AND (`Value` = 'a')
OR (
(`Header` = 'Header_2') AND (`Value` = 'b')
)
)
GROUP BY `Header`, `Value`
ORDER BY `Index`, `Header`;
并查看最后一列。
我不知道如何仅使用一个临时表来执行此操作。 我对这个结果不满意,但至少能奏效。
DROP TABLE IF EXISTS `foo2`;
CREATE TEMPORARY TABLE `foo2` (
SELECT `Index` FROM `foo`
WHERE (
(`Header` = 'Header_1') AND (`Value` = 'a')
OR (
(`Header` = 'Header_2') AND (`Value` = 'b')
)
)
GROUP BY `Index`
HAVING COUNT(DISTINCT `Header`) = 2
);
SELECT DISTINCT t1.`Index`, t1.`Header`, t1.`Value` FROM `foo` t1
INNER JOIN `foo2` t2 ON t2.`Index` = t1.`Index`
ORDER BY t1.`Index`, t1.`Header`;
怎么样...
SELECT `index`
FROM foo
WHERE (header,value) IN (('header_1','a'))
OR (header,value) IN (('header_2','b'))
GROUP
BY `index`
HAVING COUNT(*) = 2;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.