【问题标题】:More efficient SQL query structuring更高效的 SQL 查询结构
【发布时间】:2014-01-29 09:35:55
【问题描述】:

我有一个groupsusersusers_groups 表。用户和组之间的关系是多对多的。可以将用户分配到多个组。我想运行一个查询,获取具有至少 1 个公共组到特定用户 ID 的用户列表。

  1. 如何重组此查询以使其更快?我认为这可能与使用 GROUP BY 有关?

  2. 如何实现排序,使具有更多常见组的用户首先出现?

    $user_id = $this->db->escape($user_id);
    $sql = "SELECT DISTINCT(ug_user_id) 
                FROM users_groups
                INNER JOIN groups ON groups.group_id = users_groups.ug_group_id
                WHERE ug_group_id IN (
                    SELECT ug_group_id 
                        FROM users_groups 
                        WHERE ug_user_id = $user_id)
                LIMIT 50";
    $query = $this->db->query($sql);
    

【问题讨论】:

    标签: mysql sql select group-by


    【解决方案1】:

    自己加入表:

    SELECT DISTINCT (g2.ug_user_id)
        FROM
            users_groups as g1
            JOIN
            users_groups as g2 
            ON g1.ug_group_id = g2.ug_group_id
                and g1.ug_user_id != g2.ug_user_id
        WHERE g1.ug_user_id = $user_id;
    

    【讨论】:

    • 您好,感谢您的回答,但这不起作用,因为 WHERE 子句将结果限制为该特定用户 ID。我想要一个与该用户 ID 有共同组的用户列表;)
    • 谢谢,会做一些测试,让你知道:)
    • 谢谢它似乎工作!你知道是否可以按公共组的数量排序吗?如果您不这样做,请不要担心
    • 为此您需要更复杂的查询或存储过程。
    【解决方案2】:

    您还可以使用以下查询来获取按公共组数排序的列表:

    SELECT ug_user_id, 
           COUNT(*) AS COMMONCOUNT
           FROM users_groups
           WHERE ug_group_id IN (
                        SELECT ug_group_id 
                        FROM users_groups 
                        WHERE ug_user_id = $user_id)
                 AND ug_user_id <> $user_id
    GROUP BY ug_user_id     
    ORDER BY COMMONCOUNT DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多