2011-07-02 6 views
0

をデータベースに持っています。テーブルの友情にはid、username、friendusernameがあります。ユーザーが他のユーザーを友人として受け入れると、1行のレコードがテーブルに保存されます(2行ではありません)。mysqlはUN問題を持つAND問題

<?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空の値を保持し、私は15人のユーザーを選択して、MySQLのコードを自分の写真を表示ランダムにしたいですか?

問題2: AND RAND()<(SELECT ((15/COUNT(*))*10) FROM friendship) ORDER BY RAND() LIMIT 15"というステートメントは、テーブルからランダムに15レコードを選択することです。おそらく私はそれを両方のUNIONステートメントに書く必要があるでしょうか? (私は2回書く必要があるという意味です)。そうであれば、15レコードの代わりに30レコードが表示されます。私はそれぞれ8/Count LIMIT 8になるはずですか?または、他の方法でAND文を重複させないようにする方法はありますか?

答えて

0

あなただけの、あなたがUNIONを必要としない、username2の15人の友人のランダムなセットが必要な場合:

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

UNIONSELECTのいずれかから、すべてを選択します。あなたのSQLでは、最初のSELECTはフレンドシップ・テーブル内のすべてのユーザー名を取得し、次に2番目のSELECTはランダム15を取得しますが、のいずれかであった場合はUNIONは2つのいずれか結果。それはおそらくあなたが余分なユーザーを見ている理由です。

+0

OPの場合、同じユーザーは 'username'または' friendusername'として 'friendship'に格納することができます。OPには' $ username2'の別の友人が含まれているので両方のサブセットからランダムな行を選択します。 。だから、UNION(あるいはむしろUNION ALL)が必要です。 –

+0

はい、私は 'friendusername' OR 'username'(両方とも 'friendusername'だけでなく)を選択する必要があるため、UNIONが必要です。 – zac1987

+0

@ zac1987、更新された回答を参照 – Dirk