我有两张桌子:
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
获取记录的内容?
答案 0 :(得分:1)
您可以通过子选择获得结果:
SELECT
*
FROM
`qr_code` as qr
where
qr.id NOT IN (
SELECT qr_code_id
FROM area_qrcode
WHERE status = 'open'
);
使用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;
第三种可能性(不像第一种那样直观):
SELECT
*
FROM
`qr_code` as qr
WHERE NOT EXISTS (
SELECT
1
FROM
area_qrcode
WHERE
status = 'open'
AND
qr_code_id = qr.id
);
答案 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
答案 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。