[英]Selecting distinct field value based on multiple field values criteria
我有下表:
INSERT INTO tbl_test (id, name, type, value, confirmed) VALUES
(1, 'Tom', 'good', 'white', 1),
(2, 'Tom', 'bad', 'red', 1),
(3, 'Tom', 'fine', 'blue', 1),
(4, 'Tom', 'ok', 'black', 1),
(5, 'Alan', 'bad', 'yellow', 0),
(6, 'Alan', 'good', 'red', 0),
(7, 'Bob', 'nice', 'white', 0),
(8, 'Bob', 'ok', 'pink', 0),
(9, 'Joe', 'good', 'white', 0),
(10, 'Joe', 'bad', 'pink', 0),
(11, 'Joe', 'nice', 'red', 0),
(12, 'Joe', 'fine', 'blue', 0)
我想选择所有类型为'ok'
或任何其他类型的不同名称(不准确显示)。 所以输出应该是这样的:
name type value confirmed
Tom ok black 1
Alan other NULL/ /other 0
Bob ok pink 0
Joe other NULL/ /other 0
有没有什么办法可以通过单个查询来实现,而无需对 php 端的数据进行操作?
我尝试使用子查询
SELECT name, type, value, confirmed
FROM tbl_test
WHERE type = 'ok'
OR name IN (SELECT DISTINCT names FROM tbl_test WHERE type != 'ok');
但即使我尝试只选择名称,我也会遇到错误。 您能否提一些建议?
谢谢,马辛
对于不包含ok
类型的案例,您可以在包含ok
的type
案例和NOT EXISTS
的案例之间使用UNION ALL
:
SELECT DISTINCT name, type, value, confirmed
FROM tbl_test
WHERE type = 'ok'
UNION ALL
SELECT name, 'other', 'NULL/ /other', MAX(confirmed)
FROM tbl_test t
WHERE NOT EXISTS (SELECT 0 FROM tbl_test WHERE type = 'ok' and name = t.name)
GROUP BY name
您可以对表进行不同名称的LEFT
连接:
select n.name,
coalesce(t.type, 'other') type,
coalesce(t.value, 'NULL / other') value,
coalesce(t.confirmed, 0) confirmed
from (select distinct name from tbl_test) n
left join tbl_test t
on t.name = n.name and t.type = 'ok'
请参阅演示。
结果:
| name | type | value | confirmed |
| ---- | ----- | ------------ | --------- |
| Tom | ok | black | 1 |
| Bob | ok | pink | 0 |
| Alan | other | NULL / other | 0 |
| Joe | other | NULL / other | 0 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.