2015-10-15 2 views
1

Я имею эту схему:Выбрать все значения из таблицы B, где соответствует таблице A

items    | taxonomy    | subjects 
        |      | 
ID headline  | item_id subject_id | subject_id subject 
------------------------------------------------------------------------- 
1  information | 1  1   | 1    cities 
2  here we are | 2  1   | 2    towns 
3  more things | 3  2   | 3    water 
4  doo dah  | 3  4   | 4    telephones 
        | 4  1   | 
        | 4  3   | 

Я хотел бы, чтобы выбрать одну строку из «элементов», а с ним, включаю в себя все строки из «субъектов», который соединены таблицей «таксономии». Так, например, получение item.ID=3 приведет к чему-то вроде:

items.ID   = 3 
items.headline = "more things" 
subjects.subject = "towns" 
subjects.subject = "telephones" 

Я начал с этим запросом

SELECT 
    i.ID, 
    i.headline, 
    s.subject_name 
    FROM items i 
    JOIN taxonomy t 
    on i.ID=t.item_id 
    JOIN subjects s 
    on t.subject_id=s.subject_id 
    WHERE i.ID = 3 

Но это возвращает только одно значение из subject_name, даже если есть несколько значений, связанных с что item_id.

РЕДАКТИРОВАТЬ я на самом деле был LIMIT 1 на запросе, который вызывает (как сказал @Gordon Linoff) только один ряд, чтобы быть возвращен, даже хотя было несколько строк в наборе результатов, соответствующий нескольких предметов. Его решение по-прежнему хорошо, потому что я хочу только вернуть один ряд.

+0

Ваш запрос выглядит правильно. Как вы смотрите на результаты? –

+0

изначально это в PHP-приложении, но теперь я устраняю проблему с помощью phpmyadmin. – JakeParis

+0

Я подумал, что, возможно, результирующему набору не разрешено иметь несколько полей с тем же именем '(ID, subject, subject)'. – JakeParis

ответ

3

Ваш запрос возвращает объекты в нескольких строках. Если вы хотите, чтобы предметы на более одного подряд, то вам потребуется некоторая форма конкатенации:

SELECT i.ID, i.headline, GROUP_CONCAT(s.subject_name) as subjects 
FROM items i JOIN 
     taxonomy t 
     ON i.ID = t.item_id JOIN 
     subjects s 
     ON t.subject_id = s.subject_id 
WHERE i.ID = 3 
GROUP BY i.ID, i.headline; 

Для одного пункта GROUP BY является необязательным, но это хорошая форма в случае, если изменить запрос для обработки нескольких Предметы.

0

Я бы предложил вам предложение «union all» (или «union», если вам не нужны дубликаты).

(SELECT 
    "taxonomy" As Name, 
    i.headline As Value 
    FROM items i 
    JOIN taxonomy t 
    on i.ID=t.item_id 
    WHERE i.ID = 3) 

Union All 

(SELECT 
    "subject" As Name, 
    s.subject_name As Value 
    FROM items i 
    JOIN subjects s 
    on t.subject_id=s.subject_id 
    WHERE i.ID = 3) 

Вы можете добавить 2-ое поле в каждой выбрать, чтобы указать тип элемента, выбранного («заголовок», «предметы» и т.д.).

+0

Мне интересно попробовать это, но, как написано, оно не работает. Вы можете исправить код? – JakeParis

+0

В соответствии с mysql doc (https://dev.mysql.com/doc/refman/5.0/en/union.html) выбор должен быть внутри «()», и вы должны указывать имена столбцов. Я отредактировал код для соответствия правильному синтаксису. – fabrosell

Смежные вопросы