MySQL Query根据第二个表上的状态丢弃记录

时间:2014-08-16 06:20:46

标签: mysql sql

我有两张桌子:

CREATE TABLE qr_code (
    id   int(10) primary key auto_increment,
    code int(10) not null
);

CREATE TABLE area_qrcode (
    id         int(10) primary key auto_increment,
    area_id    int(10) not null,
    qr_code_id int(10) not null,
    status     set('open', 'close')
);

在我的表格中,我有以下记录:

-- qr_code
+----+------+
| id | code |
+----+------+
|  1 |  200 |
|  2 |  201 |
|  3 |  202 |
+----+------+

-- areaqr_code
+----+---------+------------+--------+
| id | area_id | qr_code_id | status |
+----+---------+------------+--------+
|  1 |       2 |          1 | open   |
|  2 |       4 |          3 | close  |
+----+---------+------------+--------+

我想从表qr_code中选择area_qrcode表中未处于 open 状态的所有记录。 qr_code.id对应area_qrcode.qr_code_id

一个好的结果集是:

+----+------+
| id | code |
+----+------+
|  2 |  201 |
|  3 |  202 |
+----+------+

我使用了以下查询,但它没有按预期工作,因为如果表area_qrcode没有与qr_code中的值对应的值,那么我得到这些记录没有结果:

SELECT
    qr.*
FROM
    `qr_code` as qr,
    `area_qrcode` as aq 
WHERE
    (
        aq.qr_code_id = qr.id and
        aq.status != 'open'
    )
    OR
    (
        aq.qr_code_id != qr.id
    );

即使qr_code中没有相关记录,我还可以更改从areaqr_code获取记录的内容?

4 个答案:

答案 0 :(得分:1)

您可以通过子选择获得结果:

SELECT 
    * 
FROM 
    `qr_code` as qr
where 
    qr.id NOT IN (
        SELECT qr_code_id 
        FROM area_qrcode 
        WHERE status = 'open'
    );

Demo

使用LEFT JOIN,您也可以获得结果:

SELECT 
    qr.* 
FROM 
    qr_code as qr 
LEFT JOIN 
    area_qrcode as aq 
ON
    qr.id = aq.qr_code_id
AND
    aq.status = 'open'
WHERE
    aq.qr_code_id IS NULL;

Updated Demo

第三种可能性(不像第一种那样直观):

SELECT 
    *
FROM 
    `qr_code` as qr
WHERE NOT EXISTS (
    SELECT
        1
    FROM
        area_qrcode
    WHERE
        status = 'open'
    AND
        qr_code_id = qr.id
);  

Demo

答案 1 :(得分:0)

SELECT qr。* FROM qr_code as qr LEFT JOIN area_qrcode as aq on aq.qr_code_id = qr.id and aq.status!='open'OR(aq.qr_code_id!= qr。 id)的

答案 2 :(得分:0)

使用适当的连接,以防止混淆。

SELECT qr_code.id,qr_code.code 
FROM qr_code 
LEFT JOIN area_qrcode 
ON area_qrcode.qr_code_id = qr_code.id
WHERE area_qrcode.status <> 'open' OR area_qrcode.status IS NULL

fiddle

答案 3 :(得分:0)

如果我正确理解了您的问题,那么这就是您正在寻找的问题:

SELECT q.id, q.code
FROM qr_code q
LEFT JOIN area_qrcode aq
ON aq.qr_code_id = q.id
WHERE (aq.status IS NULL OR aq.status <> 'open')

将导致:

ID  CODE
--  ----
2   201
3   202

提供小提琴here