繁体   English   中英

MySQL-在所有符合结果的列中选择多个值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM