2011-07-02 49 views
0

,表友誼具有id,username和friendusername。當用戶接受其他用戶爲朋友時,表中將保存1行記錄(不是2行)。我想隨機選擇15個用戶,並顯示他們的照片,MySQL代碼:mysql在數據庫中選擇具有AND問題的UNION

<?php 
$query120 = "SELECT frenusername FROM friendship WHERE username='{$username2}' UNION SELECT username FROM friendship WHERE friendusername='{$username2}' AND RAND()<(SELECT ((15/COUNT(*))*10) FROM friendship) ORDER BY RAND() LIMIT 15"; 
$result120 = mysql_query($query120,$connection) or die (mysql_error()); 
confirm_query($result120); 
while($userinfo120 = mysql_fetch_array($result120)){ 
    $frenusername= $userinfo120['frenusername']; 
    $username = $userinfo120['username']; //this hold empty value, why? 

    $query121 = "SELECT picturemedium FROM users WHERE username='{$frenusername} OR username='{$username}' LIMIT 1"; 
    //display picture 
    } 
} 
?> 

我的問題1:爲什麼 持有$username空值?

我的問題2: 聲明AND RAND()<(SELECT ((15/COUNT(*))*10) FROM friendship) ORDER BY RAND() LIMIT 15"是從表中隨機選擇15條記錄。據說我需要把它寫在兩個UNION語句上嗎? (這意味着我需要寫兩次)。如果是這樣,它將顯示30條記錄而不是15條記錄。我應該改變它爲每個變成8/Count LIMIT 8?或者是否有其他方式避免重複AND語句?

回答

0

如果你只需要一組隨機的username2的15個朋友,那麼你就不需要UNION

(SELECT username 
FROM friendship 
WHERE (friendusername='{$username2}' OR 
username='{$username2}') AND 
RAND()<(SELECT ((15/COUNT(*))*10) FROM friendship) 
ORDER BY RAND() 
LIMIT 15) 

UNION將選擇一切從任一SELECT。在您的SQL中,第一個SELECT將獲得友誼表中的所有用戶名,然後第二個SELECT將得到隨機數15,但是UNION將從兩個SELECT sa記錄中選擇任一個,如果它位於兩個SELECT結果。這可能是你看到額外用戶的原因。

+0

在OP的情況下,同一個用戶可以作爲'username'或'friendusername'存儲在'friendship'中,而OP想要從兩個子集中選擇隨機行,因爲它們都包含不同的'$ username2'朋友。所以UNION(或者說,UNION ALL)是必要的。 –

+0

是的,我需要聯盟,因爲我需要選擇'friendusername'或'用戶名'兩個(不僅'friendusername')。 – zac1987

+0

@ zac1987,查看更新的答案 – Dirk