0

我正在构建一个查询,它将为我的网站上的个人资料生成预览。

该查询涉及几个表,获取某些信息,即名称和 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'

假设所有表格数据都是正确的,如果您需要它,我会为您完成。

Ps 在我添加之前/* AMBITIONS COMPLETED */,查询似乎运行良好。我认为它是因为它包含一个双 LEFT JOIN。

提前致谢

4

2 回答 2

1

经过数小时的研究,我发现了另一种查询技术来检索以下数据:

Array
(
    [ID] => useridentifier
    [ABOUT] => ABOUT :)
    [NAME] => Chris m
    [REGISTERED] => 2013-10-21 12:54:50
    [USERNAME] => Cwiggo
    [VIEWS] => 3
    [IMAGE] => useridentifier
    [AWARDS] => 0
    [TRYBANK] => 1
    [USER_CONTACTS] => 6
    [USER_THUMBS_UP] => 6
    [TRYBES_STARTED] => 28
    [TRYBES_JOINED] => 13
    [USER_POSTS] => 8
    [AMBITIONS_STARTED] => 40
    [AMBITIONS_JOINED] => 13
    [AMBITIONS_COMPLETE] => 1
    [Retreival] => 0.00026202201843262
)

这些数据是从我的数据库中的几个表中收集的。可以看到,查询速度非常快。反正总比挂机好!

对查询的更改如下。我将提供一个片段,因为它基本上是不同表的重复代码:

SELECT u.id AS ID, 
    u.registered                AS REGISTERED, 
    u.x_account_username        AS USERNAME,
    COALESCE(uc.cnt, 0)         AS USER_CONTACTS,
    COALESCE(ut.cnt, 0)         AS USER_THUMBS_UP,

    FROM x_user u

    #IMAGES
    LEFT JOIN x_user_images images  ON u.id = images.user_id

    #CONTACTS
    LEFT JOIN 
      ( SELECT `to`,accepted,`from`, COUNT(*) AS cnt FROM
        x_allies
        GROUP BY `to`) uc
    ON (u.id = uc.to AND uc.accepted = 1 OR u.id = uc.from AND uc.accepted = 1)

    #THUMBS UP
    LEFT JOIN 
      ( SELECT user_id, COUNT(*) AS cnt FROM
        x_user_likes
        GROUP BY user_id ) ut
    ON u.id = ut.user_id
WHERE u.id = 'useridentifier'

我希望这个答案对试图从数据库表中访问、汇总和整理统计数据的开发人员有所帮助。

感谢您的评论

于 2014-09-04T15:17:44.580 回答
0

如果在添加表 x_table8 和 x_table9 后查询变慢,那么我认为 x_table9 表包含大量数据。尽量避免 LEFT JOIN。如果您想要来自 x_table8 的记录,即使它在 x_table9 表中没有关联的记录,也要使用 LEFT JOIN,然后只使用 LEFT JOIN 其他明智的 JOIN 可以更快地为您完成这项工作。

正如您所说,您正在使用它来生成配置文件,那么我建议使用 JOIN 作为没有配置文件 ID 数据的表,这对您来说意义不大。

如果您无法避免 LEFT JOIN,请尝试使用临时表并在查询中使用这些临时表,这样会快得多。

希望你能更快地做到这一点。

于 2014-09-04T09:07:13.183 回答