2011-03-03 15 views
0

Hey all。私は私のqryに論理エラーがあると思う。出力は正確ですが、トリプレット単位です。私はこれをずっと見つめておらず、それを見ていませんでした。誰かがこれにいくつかの光を当てることができますか?ありがとう!!PHP MYSQL Join Query。場所とロジックの選択

また、この情報も追加したいと考えています。

  • $ユーザーID = 1
  • $ UserIDAList =(1,1,6)
  • $ UserIDBList =(2,3,1)

PHP-コード:

$result = mysql_query("SELECT TBL_ContactsList.ContactID, TBL_ContactName.FirstName FROM TBL_ContactsList, TBL_ContactName WHERE ((TBL_ContactName.NameID != $userid) AND (TBL_ContactsList.ContactID != $userid)) AND ((TBL_ContactName.NameID IN ($UserIDAList) OR TBL_ContactName.NameID IN $UserIDBList)))"); 

while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    printf ("ID: %s Name: %s", $row[0], $row[1]); 
    echo "<br/>"; 
} 

SQLクエリ(可読性)のみ:

SELECT TBL_ContactsList.ContactID, TBL_ContactName.FirstName 
FROM TBL_ContactsList, TBL_ContactName 
WHERE ((TBL_ContactName.NameID != $userid) AND (TBL_ContactsList.ContactID != $userid)) 
AND ((TBL_ContactName.NameID IN ($UserIDAList) OR TBL_ContactName.NameID IN $UserIDBList))) 

出力:

ID: 2 Name: Joe 
ID: 3 Name: Joe 
ID: 4 Name: Joe 
ID: 2 Name: Jimbo 
ID: 3 Name: Jimbo 
ID: 4 Name: Jimbo 
ID: 2 Name: Mike 
ID: 3 Name: Mike 

編集:ここに私が使用して終了するものです。 (ここでインデントを調べることはできません)

しかし、今はdbからのエントリがありません。

$result = mysql_query("
SELECT cl.ContactID, cn.FirstName
FROM TBL_ContactName AS cn
INNER JOIN TBL_ContactsList AS cl
ON cl.ContactID = cn.NameID
WHERE
cn.NameID != $userid
AND (
cn.NameID IN ($UserIDBList) OR cn.NameID IN ($UserIDAList)
)
");
出力は次のようになります。
ID:2名:ジョー・
ID:3名:神保

しかし、私は左を入れて、私はこれを取得、JOIN。閉じるがまだIDがない。
ID:2名:ジョー・
ID:3名:神保
ID:名:マイク・

任意のアイデア?ありがとう!

+1

'TBL_ContactsList、TBL_ContactName'あなたをFROMあなたのテーブル構造体に応じてLEFTまたはRIGHT結合を試みるべきです – JohnP

+0

ねえ、johnp、そうです。すべてのコメントから、私が欠けていたのはJOIN ONでした。ありがとう! – Newphper

+1

ありがとうございました!私は@Ardaと@ DNLの回答に行きました。しかし、今私は質問に項目がありません。いくつかの実験の後、LEFT JOINを使用すると、IDを紛失していることを除いてほとんどそれが得られました。これまでのコードとその出力に関する質問を編集しました。 – Newphper

答えて

1

私はあなたのSQL構造を正しく持っている場合、このようなSQLを変更するとおそらくそれを修正する必要があります。少なくともそれは適切な使い方です。

$result=mysql_query("SELECT cl.ContactID, cn.FirstName FROM TBL_ContactsList cl INNER JOIN TBL_ContactName cn ON cn.NameID=cl.ContactID WHERE cn.NameID != $userid AND (CN.NameID IN ($UserIDAList) OR CL.NameID IN ($UserIDBList))"); 
+1

ありがとうArda!これでやった!しかし、今はDBから1つのエントリを返さない。私はそれを調べるつもりです。しかしこれはそれでした! – Newphper

1

これはあなたのために働く場合は、

$result = mysql_query(" 
    SELECT cl.ContactID, cl.FirstName 
    FROM TBL_ContactsList cl 
    JOIN TBL_ContactName cn 
    WHERE (
    cn.NameID != $userid AND 
    cl.ContactID != $userid 
) AND (
    cn.NameID IN ($UserIDAList) OR 
    cn.NameID IN ($UserIDBList) 
) 
"); 
+0

良いヒント!簡単に読むことができます。ありがとう! – Newphper

+0

こんにちは、私は、qry alittleをより読みやすくするためにONを持っていた他の回答と一緒に行った。ありがとう! – Newphper

+0

IMHOでは、表名に1文字または2文字の名前を使用しても、読みやすさは向上しません。これは、プログラミングコードの周りに1文字または2文字の変数名を持つようなものです。コードを見るたびに、それらの "fl"、 "fr"、および " "hl"などは実際には意味します。 – binaryLV

0

フィードバックを与えてくださいインデントや読みやすくするために、あなたのSQLをショートカットする必要があります

代わりの
SELECT cl.ContactID, cn.FirstName 
    FROM TBL_ContactName AS cn 
    JOIN TBL_ContactsList as cl 
    ON cn.NameID = cn.ContactID 
    WHERE cn.NameID != $userid 
    AND (cn.NameID IN ($UserIDAList) OR cn.NameID IN ($UserIDBList)); 
+0

これはほとんどそれをdnl、ありがとう!しかし、私はエラーが続いていたので、 "=="の代わりに "="を使ってArdaの答えに行った。正しいトラックで私を取得していただきありがとうございます! – Newphper

+0

変更しました::) –