2

メイン テーブルに関連付けられた一連のキーと値のペアを保持するためのプライマリ テーブルとセカンダリ テーブルがあります。この背後にある理由は、データが大きくなるにつれて、さまざまな種類の「キー」の数も増えるということです。現在の構造:

Main Table:
id|name

Secondary Table:
id|key|value

メイン テーブルからすべてのレコードを選択し、セカンダリ テーブルからいくつかのキーを選択したいと思います。私が今やっている方法は次のとおりです。

SELECT main_table.id, main_table.name, s1.value, s2.value
FROM main_table
LEFT JOIN secondary_table s1 ON s1.id = main_table.id AND s1.key = 'cats'
LEFT JOIN secondary_table s2 ON s2.id = main_table.id AND s2.key = 'dogs'

一部のレコードには 2 番目のテーブルに対応するレコードがないため、LEFT JOIN を使用する必要がありますが、とにかくレコードを返す必要があります。これは私には非効率的で、かなり遅いようです。おそらく私はそれについて間違った方法で進んでいますか?構造/クエリを改善するにはどうすればよいですか?

4

2 に答える 2

3

クエリを実行したすべてのデータを 1 つのレコードで返そうとするアプローチはやめて、本来のクエリ方法でリレーショナル データベースにクエリを実行する必要があります。だから、このようなことをしてください」:

SELECT m.id, m.name, s.key, s.value
FROM main_table AS m
INNER JOIN secondary_table AS s ON m.id = s.id
WHERE key IN ('cats', 'dogs', 'tigers', 'elephants')

この場合、主キーがオンm.idで、複合主キーがオンになっていることをイメージしていますs.id, s.keys.keyこのクエリを最適化するには、別のインデックスも必要です。

これにより、結果セットに複数の行が返されます。

于 2012-12-06T00:34:09.977 に答える
2

使用できますGROUP BY

SELECT   main_table.id, main_table.name,
         MAX(IF(s.key='cats',s.value,NULL)),
         MAX(IF(s.key='dogs',s.value,NULL))
FROM     main_table LEFT JOIN secondary_table s USING (id)
GROUP BY id
于 2012-12-06T00:36:04.423 に答える