2013-08-26 2 views
3

у меня есть две таблицы в следующей структуревыбрать несколько значений для того же ключа в нескольких таблицах

table_1

uid | name | age 
1 | John | 24 
2 | Adam | 35 
3 | Sara | 26 

table_2

id | uid | meta_key | meta_value 
1 | 2 | location | NY 
2 | 2 | school | NYU 
3 | 3 | Location | NY 
4 | 3 | school | XYZ 
6 | 1 | location | NY 
6 | 1 | school | NYU 

То, что я пытаюсь сделать это, чтобы выбрать пользователей из таблицы_1, где их местоположение находится в Нью-Йорке, а школа - NYU

здесь запрос я попытался использовать без удачи

SELECT 
    tabl_1.uid 
FROM `tabl_1`, `tabl_2` 
WHERE 
    tabl_1.uid = tabl_2.uid 
    AND table_2.meta_key IN ('location', 'school') 
    AND table_2.meta_value IN ('NY', 'NYU') 
ORDER BY tabl_1.uid ASC 

Я смотрел везде без везения, если у вас есть запрос, который работает или ссылка на решение, которое будет оценено, спасибо.

ответ

4

Вы должны попробовать

SELECT t1.uid 
FROM tabl_1 t1 INNER JOIN tabl_2 t2 
ON t1.uid = t2.uid AND t2.meta_key = 'location' AND t2.meta_value = 'NY' 
INNER JOIN tabl_2 t3 
ON t1.uid = t3.uid AND t3.meta_key = 'school' AND t3.meta_value = 'NYU' 

Проверить результат на http://sqlfiddle.com/#!2/f35ef/1/0

+0

Спасибо Марко, т его работы отлично. –

1

Try: http://sqlfiddle.com/#!2/cc913c/27

SELECT t.* FROM 
(
    SELECT a.uid, a.name, GROUP_CONCAT(b.meta_key, b.meta_value) AS mkv 
    FROM table_1 a 
    LEFT JOIN table_2 b ON b.uid = a.uid 
    GROUP BY a.uid, a.name 
) AS t 
WHERE 
    t.mkv IN ("schoolNYU,locationNY"); 
+0

Приятно подумал, но не уверен, было бы так же эффективно, как и соединение – skv

+0

Обновлен ответ - забыли заказ; для эффективного - вы можете быть правы. благодаря –

0

Попробуйте

SELECT table_1.Uid 
FROM table_1 
INNER JOIN table_2 ON table_1.Uid = table_2.Uid 
WHERE (table_2.meta_key = 'location' AND table_2.meta_value = 'NY') 
AND (table_2.meta_key = 'school' AND table_2.meta_valaye = 'NYU')