2015-02-25 4 views
1

У меня есть две таблицы, как это:Как ограничить поле в запросе в MySQL

TableOne(id, name, attr) 
{ 
    1, Mark, A 
    2, Peter, B 
    3, John, A 
    4, Mary, A 
} 
TableTwo(id, id_TableOne, path) 
{ 
    1, 1, one.png 
    2, 1, two.png 
    3, 1, three.png 
    4, 3, foo.png 
    5, 3, bar.png 
} 

SELECT TableOne.name, TableTwo.path 
FROM TableOne, TableTwo 
WHERE TableOne.attr = 'A' 
AND TableOne.id = TableTwo.id_TableOne 

That outputs: 

{ 
    Mark, one.png 
    Mark, two.png 
    Mark, three.png 
    John, foo.png 
    John, bar.png 
} 

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

{ 
    Mark, one.png 
    John, foo.png 
    Mary, NULL 
} 

Я пытался делать ПРЕДЕЛЫ и написать выберите в другой, но я не получил результат я хочу, я тоже кое-что беспокоит меня

чтения " MySQL не поддерживает LIMIT в подзапросах для Un операторов Некоторых подзапросов»

из http://dev.mysql.com/doc/refman/5.0/en/subquery-restrictions.html

Может ли кто-нибудь помочь мне решить мою проблему? Пожалуйста.

ответ

2

Попробуйте это:

SELECT TableOne.name, MIN(TableTwo.path) 
FROM TableOne LEFT JOIN TableTwo ON (TableOne.id = TableTwo.id_TableOne) 
WHERE TableOne.attr = 'A' 
GROUP BY TableOne.name 
2

Какой путь вы хотите, чтобы вернуться, если есть больше чем один? Если какой-либо путь в порядке, то вы можете использовать этот запрос:

SELECT TableOne.name, TableTwo.path 
FROM 
    TableOne INNER JOIN TableTwo 
    ON TableOne.id = TableTwo.id_TableOne 
WHERE 
    TableOne.attr = 'A' 
GROUP BY 
    TableOne.name 

если вы хотите вернуть первый путь, то вам нужно использовать это:

SELECT TableOne.name, TableTwo.path 
FROM 
    TableOne INNER JOIN (
    SELECT id_TableOne, MIN(id) as min_id 
    FROM  TableTwo 
    GROUP BY id_TableOne 
) m ON TableOne.id = m.id_TableOne 
    INNER JOIN TableTwo 
    ON TableOne.id = TableTwo.id_TableOne 
    AND m.min_id = TableTwo.id 
WHERE TableOne.attr = 'A' 
1

Вам нужно сгруппировать, а также использование и агрегации

SELECT TableOne.name, MIN(TableTwo.path) 
FROM TableOne 
LEFT JOIN TableTwo ON TableOne.id = TableTwo.id_TableOne 
GROUP BY name 
Смежные вопросы