2012-05-22 76 views
-2

比方說,給定一個song_id和UID,我們想知道(FRINDS的直接朋友和朋友)所有的朋友,喜歡同一首歌:集團第一級和第二級的朋友

這就是我們是怎麼做的它:

public function get_song_mates($uid, $song_id, $current_only = true, $limit = PHP_INT_MAX) 
    { 

     $sql = "SELECT * 
        FROM (
        (
         SELECT users . * , '1st' AS `level`, 1 AS `level_i` 
         FROM songs 
         JOIN users ON users.id = songs.user_id 
         JOIN friends AS my_friend ON my_friend.fid = users.id 
         AND my_friend.uid = '".$uid."'     
         WHERE song_id = '".$song_id."') 
        UNION (

        SELECT second_friend . * , '2nd' AS `level`, 2 AS `level_i` 
        FROM songs 
        JOIN users AS second_friend ON second_friend.id = songs.user_id 
        JOIN friends ON friends.uid = second_friend.id 
        JOIN users AS first_friend ON first_friend.id = friends.fid 
        JOIN friends AS my_friend ON my_friend.fid = first_friend.id 
        AND my_friend.uid = '".$uid."'     
        WHERE song_id = '".$song_id."' 


        AND second_friend.id NOT IN 
         (
          SELECT users.id 
           FROM songs 
           JOIN users ON users.id = songs.user_id 
           JOIN friends AS my_friend ON my_friend.fid = users.id 
           AND my_friend.uid = '".$uid."' 
          WHERE song_id = '".$song_id."' 
         ) 
        ) ORDER BY `level_i` ASC, firstname, lastname 
        ) AS friend     
        GROUP BY id ORDER BY `level_i`"; 

     $users = $this->getFromSql($sql); 
     return $users; 
    } 

但請注意,我們必須添加:

AND second_friend.id NOT IN... 

防止顯示相同的用戶直接朋友和朋友的朋友。我敢肯定,我需要利用GROUP BY,但我只是無法獲得正確的語法。這裏有什麼線索?

CNC中

friends(uid, fid) 
songs(id, user_id, song_id) 
users(id, frist_name, last_name) 
+1

你能描述一下表格,特別是FOREIGN KEYS嗎? – JHS

+1

使用字符串連接生成SQL?曾聽說過SQL注入? – gbn

+2

最好把SO上的問題減少到最基本的要求。這裏最基本的東西是SQL而不是PHP包裝器。目前的工作部分對於這個問題也不重要。事實上,SQL是不可讀的,因爲它綁定在PHP中。另外,請注意[SQL注入](http://xkcd.com/327)! –

回答

0

固定這樣的:

公共職能get_song_mates($ UID,$ song_id,$ current_only = TRUE,$限制= PHP_INT_MAX) {

$sql = "SELECT DISTINCT * 
       FROM (
       (
        SELECT users . * , '1st' AS `level`, 1 AS `level_i` 
        FROM songs 
        JOIN users ON users.id = songs.user_id 
        JOIN friends AS my_friend ON my_friend.fid = users.id 
        AND my_friend.uid = '".$uid."'     
        WHERE song_id = '".$song_id."') 
       UNION (

       SELECT DISTINCT second_friend . * , '2nd' AS `level`, 2 AS `level_i` 
       FROM songs 
       JOIN users AS second_friend ON second_friend.id = songs.user_id 
       JOIN friends ON friends.uid = second_friend.id 
       JOIN users AS first_friend ON first_friend.id = friends.fid 
       JOIN friends AS my_friend ON my_friend.fid = first_friend.id 
       AND my_friend.uid = '".$uid."'     
       WHERE song_id = '".$song_id."'"; 

    $users = $this->getFromSql($sql); 
    return $users; 
} 
相關問題