选择除我们两个SQL之外的所有我和我的朋友朋友

时间:2012-01-28 23:04:45

标签: php

我有桌子“user_follow”,“images”,“users”

我的user_id:3 我的朋友user_id:6

我需要查询以选择我和朋友的所有朋友的用户名和图片 1)不要互相告诉我们 2)重复的朋友显示为1

我的查询是:

    $sql = "SELECT u.username, i.image, u.id
            FROM users u
            LEFT JOIN user_follow f ON u.id = f.follow_id
            LEFT JOIN images i ON u.id = i.user_id
            WHERE f.user_id = 6 OR f.user_id = 3
            GROUP BY u.id
            ORDER BY f.date DESC";

结果是:

[user_both_follow] => Array
    (
        [0] => Array
            (
                [username] => Kolxoznik1
                [image] => 
                [id] => 1
            )

        [1] => Array
            (
                [username] => 7777
                [image] => 
                [id] => 8
            )

        [2] => Array
            (
                [username] => 6666
                [image] => flw3utn9igiqh7dtt2o61ydf8_174.jpeg
                [id] => 6
            )

        [3] => Array
            (
                [username] => 8888
                [image] => 
                [id] => 7
            )

    )

我的查询工作率为50%,它将相同的朋友分组,但问题是显示我的朋友3-> 6(显示)

1 个答案:

答案 0 :(得分:2)

什么是' id'专栏?恕我直言主键应该是(user_id,follow_id).. 一个简单的AND f.follow_id != 3 and f.follow_id != 6应修复您的查询。

可能简化为:

WHERE f.user_id IN(3,6) AND f.follow_id NOT IN (3,6)

此外,您可能需要(RIGHT) JOIN user_follow而不是左。

此外,也许MySQL很聪明,可以对此进行优化,但我想知道EXPLAIN是否为该查询说明了不同的内容:

        SELECT u.username, i.image, u.id
        FROM user_follow f
        JOIN users u ON u.id = f.follow_id
        LEFT JOIN images i ON u.id = i.user_id
        WHERE f.user_id IN(3,6) AND f.follow_id NOT IN(3,6)
        GROUP BY u.id
        ORDER BY f.date DESC

可能足够聪明,但为什么要让查询计划员猜测......