2012-03-22 3 views
0

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

ids   urns    urn_urls  urls 
id | type id | uid | urn uid | lid lid | url 
---+----- ---+-----+----- ----+---- ----+---- 
1 | 1  1 | 1 | urn1 1 | 1  1 | url1 
2 | 4  2 | 2 | urn2 1 | 2  2 | url2  
3 | 4  2 | 3 | urn3 2 | 3  3 | url3 
4 | 4  3 | 4 | urn4 2 | 4  4 | url4 
...|...  3 | 5 | urn5 3 | 4  5 | url5 
.    4 | 6 | urn6 4 | 5  6 | url6 
.   ...| ... | ...  5 | 5  ...| ... 
.        6 | 1 
.        6 | 6 

Что я хотел бы иметь это запрос, в котором перечислены те записи, идентификатор типа 4, которые связанный с более чем одной урны и corrosponding урн, как это:

result 
id | url 
---+----- 
2 | url3 
2 | url4 
4 | url1 
4 | url6 

я уже пытался что-то вроде этого:

SELECT id,url 
    FROM ids 
    NATURAL JOIN urns 
    NATURAL JOIN urn_urls 
    NATURAL JOIN urls 
    WHERE type=4 
    HAVING count(#column#)>1; 

с #column# один из (id, lid, url), но он возвращается только по строке; , когда я добавил GROUP BY заявления, я получаю больше, но не apropriate результатов

SELECT id,url 
    FROM ids 
    NATURAL JOIN urns 
    NATURAL JOIN urn_urls 
    NATURAL JOIN urls 
    WHERE type=4 
    GROUP BY #group# 
    HAVING count(#column#)>1; 

для различных комбинаций #group#/#column# из (id, lid, url).

Итак, помощь приветствуется.

+0

Почему 'urn1' быть в результате? Он подключен к id 1, который имеет тип 1, а не 4. – Guffa

+0

моя ошибка. результат должен содержать URL-адреса;) Я отредактирую это –

ответ

0

Как насчет -

SELECT id, GROUP_CONCAT(urls.url SEPARATOR ' ') 
FROM ids 
NATURAL JOIN urns 
NATURAL JOIN urn_urls 
NATURAL JOIN urls 
WHERE type=4 
GROUP BY ids.id 
HAVING COUNT(DISTINCT urls.url)>1; 
+0

Почти то, что я хочу. Это может сработать, если можно объединить пространство как разделитель (так как двоеточие также может быть частью URL-адреса). Еще лучше иметь на строке результата на URL-адрес, как в моем примере. –

+0

Вы можете использовать все, что хотите для разделителя - [GROUP_CONCAT()] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat). Также обратите внимание, что длина возвращаемого значения ограничена 'group_concat_max_len' – nnichols

+0

. Я проверил это с моим примером и заметил, что это вернет следующее:
' 2 | url3 url4'
'3 | url5 url5'
'4 | url1 url6'
так что я действительно не хотел id = 3, так как он связан только с одним URL (дважды) –

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