【问题标题】:Select specific record or records with the same value in a column在列中选择特定记录或具有相同值的记录
【发布时间】:2012-12-18 16:02:37
【问题描述】:

我有这个数据表:

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 查询)?

【问题讨论】:

  • 请发布EXPLAIN的结果
  • 只有我或这个查询,如果a1groupNULL,将返回a1s1t1
  • 是的,这个查询不太擅长,应该加NULL测试
  • 已添加说明,已修复 NULL 组

标签: mysql select


【解决方案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' 的行,则返回该行。该查询还将返回具有group 值的name 值,该值与name = 'a1' 行的任何group 值匹配。

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 2021-03-22
    • 1970-01-01
    • 2013-11-10
    • 2022-11-01
    • 2016-01-26
    • 1970-01-01
    • 2019-01-28
    • 2023-04-01
    相关资源
    最近更新 更多