我们有一个主表和一个辅助表来保存一堆与主表关联的键值对。这背后的原因是随着我们的数据增长,不同类型的“密钥”的数量也会增加。目前的结构:
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,因为某些记录在第二个表中没有相应的记录,但我还是需要记录才能返回。这对我来说效率低下而且速度很慢。也许我会以错误的方式去做?如何改进结构/查询?
答案 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