1

私は答えを探し回ってみましたが、私が探している場所に私を完全に導くようなものは見つかりませんでした. 現在、参加しようとしているテーブルが 2 つあります。

接着剤テーブル

id | adhesive_name | adhesive_code
1  | Ivory         | 0090
2  | Jet Black     | 0100
3  | Khaki         | 0110
4  | Natural       | 0120

および match_table

id | brand_id | sheet_name | match_1 | match_2
1  | 1        | Wheat      | 0110    | 0120
2  | 1        | Dew        | 0090    | 0110

などなど... 何千ものマッチと何百もの接着剤があります。JOINを使用して一致を取得し、対応するadhesive_nameを返そうとしています。

$sql = "SELECT * FROM match_table
JOIN adhesive_table
ON match_table.match_1 = adhesive_table.adhesive_code
WHERE match_table.brand_id
IN ($b)";

($b は $.post を介して送信され、brand_id に対応します)

そして、これは単一の一致に対してはうまく機能します。しかし、多くの場合、match_2 で示される 2 番目の (代替) 一致が利用可能です。そのため、一致する 1,2,3 の名前を取得できる JOIN を機能させようとしましたが、役に立ちませんでした。私は次のようなクエリを試してきました:

$sql = "SELECT * FROM match_table
LEFT JOIN adhesive_table
ON match_table.match_1 = adhesive_table.adhesive_code
LEFT JOIN adhesive_table
ON match_table.match_2 = adhesive_table.adhesive_code
WHERE match_table.brand_id
IN ($b)";

また

$sql = "SELECT * FROM match_table
JOIN adhesive_table
ON match_table.match_1 = adhesive_table.adhesive_code
AND match_table.match_2 = adhesive_table.adhesive_code
WHERE match_table.brand_id
IN ($b)";

しかし、どちらも機能しません。テーブルのフォーマットが原因でこれが機能しないのか、それとも明らかな何かが欠けているのか疑問に思っています。これは、group_concat を使用する必要がある場所ですか?

ご協力いただきありがとうございます。

結果として取得したいテーブルを追加する必要があります。結果は次のようになります。

brand_id = 1
sheet_name = Wheat
 match_1 = (adhesive_code & adhesive_name) 0110 Khaki
 match_2 = (adhesive_code & adhesive_name) 0120 Natural

クエリの後、結果は配列に入れられます

$arr = array();
$result = mysql_query($sql);
if($result) {
    while($row = mysql_fetch_array($result)){
        $arr[] = $row;
} 
} else {
$arr[] = "";
}
echo json_encode($arr);

これはメイン ファイルに送り返され、次のようなループで結果を取得しています。

$.post("getmatches.php",{checkedBrand:checkedBrand},function(json){
    for(var i=0; i<json.length; i++){
        htmlFormat += 
        " sheet : " + json[i].sheet_name
        + " - " + "match_1 : " + json[i].adc1 
        + " - " + "name : "  + json[i].ad1
        + " - " + "match_2 : " + json[i].adc2
        + " - " + "name : "  + json[i].ad2
        + "<br />";
    } // end for loop
    $(".stuffs").html(htmlFormat)
}) // end post  

Sebas の忍耐と助けに感謝します。使用された最終的な作業方法は次のとおりです。json が返された後に JavaScript でそれらを参照できるように、列を AS エイリアスとして選択するように追加しました。

$sql="
SELECT brand_id, sheet_name, a.adhesive_name AS ad1, a.adhesive_code AS adc1, b.adhesive_name ad2, b.adhesive_code adc2
FROM match_table
LEFT JOIN adhesive_table a ON match_table.match_1 = a.adhesive_code
LEFT JOIN adhesive_table b ON match_table.match_2 = b.adhesive_code
WHERE
match_table.brand_id IN ($b)";
4

2 に答える 2

2
$sql="SELECT id, brand_id, sheet_name, a.adhesive_name, a.adhesive_code FROM match_table 
INNER JOIN adhesive_table a
ON match_table.match_1 = a.adhesive_code
WHERE match_table.brand_id
IN ($b)
UNION
SELECT id, brand_id, sheet_name, a.adhesive_name, a.adhesive_code FROM match_table 
INNER JOIN adhesive_table a 
ON match_table.match_2 = a.adhesive_code
WHERE match_table.brand_id
IN ($b)";

編集:上記のクエリを編集して、両方の一致を別々の行でより明確に表示しました。一方、両方を同じ行に配置したい場合は、別の別の行を次に示します。

$sql="
SELECT id, brand_id, sheet_name, a.adhesive_name, a.adhesive_code, b.adhesive_name, b.adhesive_code 
FROM match_table 
    LEFT JOIN adhesive_table a ON match_table.match_1 = a.adhesive_code
    LEFT JOIN adhesive_table b ON match_table.match_2 = b.adhesive_code
WHERE 
    match_table.brand_id IN ($b)
AND (a.id IS NOT NULL OR b.id IS NOT NULL)";
于 2012-05-29T22:08:46.287 に答える
0

最初の試みは、1つの詳細を除いて問題ありませんでした。同じテーブルに2回参加する場合は、エイリアスを使用してください。

SELECT * FROM match_table
LEFT JOIN adhesive_table ad1 ON match_table.match_1 = ad1.adhesive_code
LEFT JOIN adhesive_table ad2 ON match_table.match_2 = ad2.adhesive_code
WHERE match_table.brand_id=1;
于 2012-05-29T23:07:20.153 に答える