-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)
你能描述一下表格,特別是FOREIGN KEYS嗎? – JHS
使用字符串連接生成SQL?曾聽說過SQL注入? – gbn
最好把SO上的問題減少到最基本的要求。這裏最基本的東西是SQL而不是PHP包裝器。目前的工作部分對於這個問題也不重要。事實上,SQL是不可讀的,因爲它綁定在PHP中。另外,請注意[SQL注入](http://xkcd.com/327)! –