我正在构建一个查询,该查询将在我的网站上为配置文件生成预览。在mysql中包含COUNT和LEFT JOINS的交叉表查询
该查询涉及多个表,获得某些信息,即姓名和COUNT()以用于统计某个特征,即他们有多少喜欢。
下面的查询是永久执行。我看到的其中一个问题是我使用了LEFT JOINS来获取所有数据。所以首先,任何人都可以帮助我了解如何选择JOIN用于什么查询。
除此之外,任何人都可以看到我做错了什么。什么花了很长时间才能执行。
下面是该查询:
SELECT u.id AS id,
u.about AS About,
CONCAT(u.fn,' ',u.ln) AS Fullname,
u.username AS Username,
i.image AS Image,
COUNT(DISTINCT a.id) AS Contacts,
COUNT(DISTINCT ul.id) AS Thumbs,
u.views AS Views,
COUNT(DISTINCT o.id) AS TrybesStarted,
COUNT(DISTINCT ti.id) AS TrybesJoined,
COUNT(DISTINCT ai.id) AS AmbitionsSupporting,
COUNT(DISTINCT am.id) AS AmbitionsCompleted,
COUNT(DISTINCT sp.id) AS Posts
FROM x_table1 u
/* PIC */
LEFT JOIN x_table2 i
ON u.id = i.user_id
/* CONTACTS */
LEFT JOIN x_table3 a
ON (u.id = a.to AND a.accepted = 1 OR u.id = a.from AND a.accepted = 1)
/* THUMBS UP */
LEFT JOIN x_table4 ul
ON (u.id = ul.profile_id)
/* TRYBES STARTED */
LEFT JOIN x_table5 o
ON (u.id = o.profile_id)
/* TRYBES JOINED */
LEFT JOIN x_table6 ti
ON (u.id = ti.to AND ti.accepted = 1)
/* AMBITIONS SUPPORTING */
LEFT JOIN x_table7 ai
ON (u.id = ai.to AND ai.accepted = 1)
/* AMBITIONS COMPLETED */
LEFT JOIN x_table8 ao
ON (u.id = ao.profile_id)
LEFT JOIN x_table9 am
ON (ao.ambition_id = am.id AND am.complete = 1)
/* POSTS */
LEFT JOIN x_table10 sp
ON (u.id = sp.profile_id)
WHERE u.id = '1234userid'
假设所有的表中的数据是正确的,如果你想它要求它,我都会给你做。
P.s.在添加/* AMBITIONS COMPLETED */
之前,查询似乎运行正常。我认为它是因为它包含一个双LEFT JOIN。
在此先感谢
没有你的数据模型的详细知识(特别是哪些领域进行索引),这是一个猜谜游戏,为什么它需要很长的时间。你看过执行计划吗? – 2014-09-04 09:02:31
我刚刚抨击了mysql代码,看是否有人可以发现语义或语法中的任何错误。索引的唯一字段是主键,通常是每个表的IDS。我没有听说过执行计划。请告诉。谢谢 – cwiggo 2014-09-04 09:05:21
对不起,MySQL使用术语“解释计划”(就像Oracle);从这里开始http://dev.mysql.com/doc/refman/5。7/EN /执行计划,information.html – 2014-09-04 12:41:25