2009-12-28 2 views
4

я в основном есть две таблицы:Как выбрать из объединенных таблиц MySQL?

A(id int, name varchar(10), info varchar(10)) 
B(id int, item varchar(10)) 

A 
1 A Hello 
2 B World 
3 C Foo 

B 
1 apple 
1 orange 
1 hammer 
2 glass 
2 cup 

Используя следующий запрос ...

mysql> SELECT a.id, a.name, a.info, group_concat(b.item SEPARATOR ' ') 
     FROM a 
     LEFT OUTER JOIN b ON (a.id=b.id) 
     GROUP BY 1,2,3; 

я получить желаемый результат:

+------+------+-------+------------------------------------+ 
| id | name | info | group_concat(b.item separator ' ') | 
+------+------+-------+------------------------------------+ 
| 1 | A | Hello | apple orange hammer    | 
| 2 | B | World | glass cup       | 
| 3 | C | Foo | NULL        | 
+------+------+-------+------------------------------------+ 

Теперь я хотел бы изменить запрос получить таблицу результатов, содержащую ту же информацию, но только те, у кого есть элементы, начинающиеся с буквы o, (like 'o%'). Как получить данные снижение производительности?

+------+------+-------+------------------------------------+ 
| id | name | info | group_concat(b.item separator ' ') | 
+------+------+-------+------------------------------------+ 
| 1 | A | Hello | apple orange hammer    |       
+------+------+-------+------------------------------------+ 

Обратите внимание, что я все еще хочу, чтобы представить всю строку 'apple orange hammer', а не только 'orange'

ответ

1

Еще один способ сделать это:

SELECT a.id, a.name, a.info, group_concat(b.item SEPARATOR ' ') AS items 
    FROM a 
    LEFT OUTER JOIN b ON (a.id=b.id) 
    GROUP BY 1,2,3 
    HAVING items REGEXP '[[:<:]]o'; 
1
SELECT a.id, a.name, a.info, group_concat(b.item SEPARATOR ' ') 
FROM a 
LEFT OUTER JOIN b ON (a.id=b.id) 
WHERE a.id in (select id from b where upper(SUBSTRING(b.item,0,1)) = 'O') 
GROUP BY 1,2,3 
0
SELECT * FROM 
    (SELECT a.id, a.name, a.info, group_concat(b.item SEPARATOR ' ') 
    FROM a 
    LEFT OUTER JOIN b ON (a.id=b.id) 
    GROUP BY 1,2,3) 
WHERE a.id IN (SELECT bb.id FROM b AS bb WHERE name like 'o%'); 

Я сомневаюсь, что это работает хорошо, но, кажется мне логичным.

0

После того, как группа вам понадобится сделать оператор типа like на group_concat.

Group By 1,2,3 
HAVING group_concat(b.item SEPARATOR ' ') like ('%o%') 

Пожалуйста, обратите внимание, что я просто ищу любую информацию о том, что вам нужно будет настроить аналогичное заявление в соответствии с вашими требованиями.

2
SELECT a.id, a.name, a.info, group_concat(b.item SEPARATOR ' ') AS bs 
FROM a 
LEFT OUTER JOIN 
     b 
ON  b.id = a.id 
GROUP BY 
     id, name, info 
HAVING 
     bs RLIKE '[[:<:]]o' 

или это (больше индекс эффективной):

SELECT a.id, a.name, a.info, 
     (
     SELECT GROUP_CONCAT(b.item SEPARATOR ' ') AS bs 
     FROM b 
     WHERE b.id = a.id 
     ) AS bs 
FROM (
     SELECT DISTINCT b.id 
     FROM b 
     WHERE item LIKE 'o%' 
     ) q 
JOIN a 
ON  a.id = q.id 

Последний запрос быстрее, если у вас есть композитный индекс b (item, id)

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