2012-05-29 2 views
1

Я пробовал искать ответ, но не нашел того, который, похоже, доставит меня туда, где я хочу быть. У меня есть две таблицы прямо сейчас, я пытаюсь присоединиться.MYSQL Query JOIN несколько полей в одно поле

adhesive_table

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 

Etc ... Там тысячи матчей и сотни клеев. Я пытаюсь схватить матч и вернуть соответствующее имя_каталога, используя 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)"; 

(за $ б отправляется через $ .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 alias, чтобы я мог ссылаться на них в javascript после возврата json.

$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)"; 
+1

Пожалуйста, не используйте ''   для форматирования кода, но использовать 'вместо или отступ (см мой выбор) – j0k

ответ

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)"; 

EDIT: Я редактировал мой выше запрос, чтобы показать, как вышлет в отдельных строках более четко. С другой стороны, если вы хотите их обоих в одной и той же линии, вот еще одна иная:

$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)"; 
+0

Да! Эта. Большое вам спасибо, это потрясающе. UNION. Еще новичок в MYSQL, не понимал, что это то, чем я был. Ты звезда. – pkabu

+0

tsssss oh остановить его, вы: p – Sebas

+0

Есть ли способ объединить содержимое в одну строку?Использование UNION, похоже, дублирует все. Я возвращаю результаты через AJAX и запускаю forloop, чтобы получить двойные данные. Это где-то я должен использовать AS? пример: http://integra.pyknyk.ca/w3c/checkbox.php Если нажать на поверхности твердого тела> Westag-GETALIT (это небольшая диаграмма так легко управлять) Вы можете увидеть данные возвращается дважды. Вы получаете совпадение 1 имя, а затем 2 (нулевое, что отлично, если нет данных) имя (повторяет имя для соответствия 1) – pkabu

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; 
+0

Я все время становлюсь неопределенным, но вижу логику. Я буду продолжать играть, чтобы посмотреть, смогу ли я заставить его работать. Спасибо за ответ. – pkabu

+0

Да, этот запрос работает с первым LEFT JOIN ... но второй заставляет его ничего не возвращать. Или наоборот, если я сохраню второй и удалю первый. Несмотря на то, что только один, похоже, принят. – pkabu