1

我试着四处寻找答案,但没有找到一个似乎能让我进入我想要的地方的答案。我现在有两张桌子,我正在尝试加入。

胶粘剂表

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 返回相应的粘合剂名称。

$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 指示的第二个(替代)匹配。所以我一直在尝试让 JOIN 工作,我可以在其中获取匹配 1、2、3 的名称,但无济于事。我一直在尝试这样的查询:

$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的耐心和帮助,最终使用的工作方法如下。我添加了选择列 AS 别名,以便我可以在 json 返回后在 javascript 中引用它们。

$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

您的第一次尝试很好,除了一个细节:如果您在同一张桌子上加入两次,请使用别名:

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 回答