0

私はデータを含むこのテーブルを持っています:

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ますか?

4

1 に答える 1

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を持つの値も返します。groupgroupname = 'a1'

于 2012-12-18T16:20:36.373 に答える