2015-10-30 3 views
1

я получил 2 таблицы, одна из моей таблицы выглядит следующим образом (пример):отношение один ко многим MySQL - получить только один много-запись

tbl1 
------------- 
id int PK 
name string 

Другой выглядит следующим образом:

tbl2 
------------- 
type int PK FK (tbl1.id) 
langid int PK 
content string 

Так что я хочу: хочу получить все строки из tbl1, объединенные вместе с результатами tbl2. Но я не хочу, чтобы каждый langid добавлял результат к соединению. Так что, если tbl1 содержит такие данные:

id: 1, name: test1 
id: 2, name: test2 

И tbl2 содержит такие данные:

type: 1, langid: 1, content: testcontent 
type: 1, langid: 2, content: testcontent2 
type: 2, langid: 3, content: testcontent3 

Я хочу только следующие данные:

tbl1.id: 1, tbl1.name: test1, tbl2.type: 1, tbl2.langid: 1, tbl2.content: testcontent 
tbl1.id: 2, tbl1.name: test2, tbl2.type: 2, tbl2.langid: 3, tbl2.content: testcontent3 

Поэтому он должен получить один результат с langid, которые существуют. Надеюсь, я объяснил это хорошо. Я попытался это:

SELECT * FROM `tbl1` INNER JOIN `tbl2` ON (`tbl1`.`id` = `tbl2`.`type`) WHERE `tbl2`.`langid` = 1 

Но иногда LANGID 1 не существует, а просто LANGID 2 этим заголовком. Мне нужно получить строку tbl1 с одним результатом из tbl2.

+0

... где 'tbl2'. 'Langid' = 1 ... ?? – zipzit

+0

Да, забыл об этом, спасибо, что заметил. –

+0

Я не понимаю, что вы подразумеваете под «Но иногда langid 1 не существует и просто langid 2 этим заголовком. Мне нужно получить строку tbl1 с одним результатом из tbl2». Ваш код говорит получить вывод для соединения, когда таблица №2, идентификатор языка = 1. Если этот языкID не существует, вы должны получить нулевой набор в качестве ответа. Какой результат вы получаете? Подсказка: http://sqlfiddle.com/ - ваш друг, когда вы пытаетесь задавать такие вопросы. – zipzit

ответ

1

Оригинальное представление (только получает первый ответ ... но это не то, что вы хотите ...)

SELECT * FROM `tbl1` INNER JOIN `tbl2` ON (`tbl1`.`id` = `tbl2`.`type`) WHERE 1 LIMIT 1 

Update - Я думаю, что это то, что вы хотите. Это работает на SQLfiddle

select * 
    FROM `tbl1` INNER JOIN `tbl2` 
    ON (`tbl1`.`id` = `tbl2`.`type`) 
    Group by tbl1.id 

Ответ:

id name type langid content 
1 test1  1  1 content1 
2 test2  2  3 content3 
+0

Не работает, ваше редактирование получит только один результат; так и только один результат от 'tbl1' –

+0

Спасибо, это работает, очень ценится. –

+0

Самое сложное, что нужно сделать здесь - это голос именно того, чего вы хотите в самых простых условиях. Я думаю, мы все с этим справляемся. – zipzit

0

Я думаю, что вы хотите LEFT JOIN, с условием, на другом столе в состоянии присоединиться:

SELECT * 
FROM `tbl1` 
LEFT JOIN `tbl2` ON `tbl1`.`id` = `tbl2`.`type` 
    AND `tbl2`.`langid` = 1 

Это даст вы каждый ряд из tbl1 один раз, с данными из tbl2, только если он существует с langid 1.

+0

Проблема в том, что он должен попытаться получить langid = 2, когда = 1 возвращает NULL и так далее. –