正确地将键值表连接到主表

时间:2012-12-06 00:24:10

标签: mysql

我们有一个主表和一个辅助表来保存一堆与主表关联的键值对。这背后的原因是随着我们的数据增长,不同类型的“密钥”的数量也会增加。目前的结构:

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'

我必须使用LEFT JOIN,因为某些记录在第二个表中没有相应的记录,但我还是需要记录才能返回。这对我来说效率低下而且速度很慢。也许我会以错误的方式去做?如何改进结构/查询?

2 个答案:

答案 0 :(得分:3)

我会说你应该放弃尝试在一条记录中返回所有查询数据的方法,只是按查询方式查询关系数据库。所以做这样的事情“:

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.key上有一个复合主键。您还需要s.key上的单独索引来优化此查询。

这会返回结果集中的多行。

答案 1 :(得分: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