我有这个数据表:
NAME | GROUP
------------
a1 | A
a22 | A
c1 | C
c2 | C
s1 | NULL
t1 | NULL
如何选择名为a1
的记录,如果此记录包含group <> NULL
,还包括同一组中的其他项目?
我尝试过子查询:
SELECT `name`, `group` FROM `tbl`
WHERE (`name` = 'a1' AND `group` IS NULL) OR `group` = (SELECT `group` FROM `tbl` WHERE `name` = 'a1')
EXPLAIN
:
id select_type table type possible_keys key key_len ref rows
1 PRIMARY tbl ALL PRIMARY NULL NULL NULL 6 Using where
2 SUBQUERY tbl const PRIMARY PRIMARY 386 const 1
这有效,但我不确定它是否100%正确和有效。寻找更好的解决方案,可能是JOIN
?
MySQL内部问题:是否对外表中的每个搜索记录执行内部SELECT
查询?此查询的结果是否已缓存(如SELECT SQL_CACHE
查询)?
答案 0 :(得分:1)
以下查询将返回与规范匹配的结果集。
SELECT DISTINCT COALESCE(t.name,s.name) AS `name`
FROM `tbl` s
LEFT
JOIN `tbl` t
ON t.group = s.group
WHERE s.name = 'a1'
如果表中存在name = 'a1'
的行,则返回该行。该查询还将返回name
的值,其group
值与group
行的name = 'a1'
值匹配。