2011-02-09 10 views
0

私は最初に目標を明確に説明しようとします:MySQLクエリWHEREクエリはクエリ自体ですか?

まず、データベースの1つのテーブルにユーザー名のリストを照会します。

第2に、これらのユーザー名を取得し、データベース内の別のテーブルをクエリし、これらのユーザー名がユーザー名フィールドに表示されている行のみを返したいとします。

最後に、この出力を(今のJSON配列形式で)取り出し、要求元のクライアントに返します。

私のクエリは今、この権利のようになります。

$query = mysql_query("SELECT * FROM tagusers WHERE username = 
    (SELECT userA FROM friendtable WHERE userB = '$username')"); 

時にWHERE文の利回り1つの結果これは動作します。だから、返されたuserAが1つしか得られなければ、うまく動作します。しかし、私が複数取得した場合、私はエラーの束を取得します。ここで

は、全体のコードです:

if (isset($_POST['username'])) { 
$username = $_POST['username']; 


$connect = mysql_connect("localhost", "root", ""); 
mysql_select_db("TagDB"); 

$query = mysql_query("SELECT * FROM tagusers WHERE username = 
    (SELECT userA FROM friendtable WHERE userB = '$username')"); 

    } 

while ($e = mysql_fetch_assoc($query)) { 
    $output[] = $e; 
} 

$output = json_encode($output); 

print $output; 

私は、クエリの行に次のエラーを取得する:

*警告:するmysql_query()[function.mysql-クエリ]:保存することができません。結果はC:\ wamp \ www \ tag \ appgetfriendinfo.phpの21行目に設定されます*

私が本当に知る必要があるのは、どのように私はそのクエリをMySQLで書くのですか?

+0

あなたはWHERE名みましたIN(...) –

答えて

5

サブクエリはまったく必要ありません。通常、結合のパフォーマンスが向上します。あなたはtagusers.username上で定義されたインデックスを持っていることを確認し、friendtable.userAとfriendtable.userB

SELECT 
    tagusers.* 
FROM 
    tagusers 
INNER JOIN 
    friendtable 
ON 
    tagusers.username = friendtable.userA 
AND 
    friendtable.userB = '$username' 
+0

INNER JOINとは思えませんでした。私のソリューションよりも優れたパフォーマンスを発揮します。 +1してください。 –

+1

ランドルフの提案はうまくいきましたが、私もこれを試すつもりです。編集:ランドルフはこれを承認していないのを見た。私はそれが動作することを確認し、もしそうなら緑色のチェックを与えるでしょう。どちらもあなたの投票を得る、おかげでトン! EDIT2:うん、これは動作します!そんなにお二人ともにありがとう。 – JMRboosties

+0

ええ、それは遅く、私は眠る必要があります。私はすでに今夜ServerFaultに私の名前を投げた:-)。 –

2

キーワードINを使用してください。

$query = mysql_query("SELECT * FROM tagusers WHERE username IN 
    (SELECT userA FROM friendtable WHERE userB = '$username')"); 
+0

ありがとう、私はこれを試してみましょう。 – JMRboosties

+0

@ダンのアイデアにも試してください。 INNER JOINはより良いパフォーマンスを発揮します(インデックスがすべて良いと仮定します)。 –

1

使用するかIN句、またはaは、この例のように、JOIN:

$query = sprintf("SELECT tu.* 
        FROM TAGUSERS tu 
        JOIN FRIENDTABLE ft ON ft.usera = tu.username 
        WHERE ft.userB = '%s'", 
        mysql_real_escape_string($_POST['username'])); 

$result = mysql_query($query); 

$output = json_encode($result);