如何从连接的MySQL表中进行选择?

如何从连接的MySQL表中进行选择?,sql,mysql,Sql,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 +------+------+-------+------------------------------------+ | id | name | info | group

我基本上有两张桌子:

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
+------+------+-------+------------------------------------+
| id   | name | info  | group_concat(b.item separator ' ') |
+------+------+-------+------------------------------------+
|    1 | A    | Hello | apple orange hammer                | 
|    2 | B    | World | glass cup                          | 
|    3 | C    | Foo   | NULL                               | 
+------+------+-------+------------------------------------+
正在使用以下查询

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                               | 
+------+------+-------+------------------------------------+
我得到了期望的输出:

+------+------+-------+------------------------------------+
| id   | name | info  | group_concat(b.item separator ' ') |
+------+------+-------+------------------------------------+
|    1 | A    | Hello | apple orange hammer                | 
|    2 | B    | World | glass cup                          | 
|    3 | C    | Foo   | NULL                               | 
+------+------+-------+------------------------------------+
现在我想修改查询以获得一个结果表,该表包含相同的信息,但只包含以字母o开头的项目,
(如“o%”)
如何获得以下输出

+------+------+-------+------------------------------------+
| id   | name | info  | group_concat(b.item separator ' ') |
+------+------+-------+------------------------------------+
|    1 | A    | Hello | apple orange hammer                | 
|    2 | B    | World | glass cup                          | 
|    3 | C    | Foo   | NULL                               | 
+------+------+-------+------------------------------------+
+------+------+-------+------------------------------------+
| id   | name | info  | group_concat(b.item separator ' ') |
+------+------+-------+------------------------------------+
|    1 | A    | Hello | apple orange hammer                |                        
+------+------+-------+------------------------------------+
请注意,我仍然希望显示整个字符串
'apple orange hammer'
,而不仅仅是
'orange'

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

我怀疑这是否能很好地执行,但在我看来这似乎是合乎逻辑的。

在group by之后,您需要在group_concat上使用不得不执行的like运算符

+------+------+-------+------------------------------------+
| id   | name | info  | group_concat(b.item separator ' ') |
+------+------+-------+------------------------------------+
|    1 | A    | Hello | apple orange hammer                | 
|    2 | B    | World | glass cup                          | 
|    3 | C    | Foo   | NULL                               | 
+------+------+-------+------------------------------------+
Group By 1,2,3
HAVING group_concat(b.item SEPARATOR ' ') like ('%o%')

请注意,我正在寻找您需要调整类似声明以符合您的要求的任何o。

还有另一种方法:

+------+------+-------+------------------------------------+
| id   | name | info  | group_concat(b.item separator ' ') |
+------+------+-------+------------------------------------+
|    1 | A    | Hello | apple orange hammer                | 
|    2 | B    | World | glass cup                          | 
|    3 | C    | Foo   | NULL                               | 
+------+------+-------+------------------------------------+
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';
选择a.id、a.name、a.info、group_concat(b.项目分隔符“”)作为项目
从
左外连接b打开(a.id=b.id)
按1,2,3分组
具有项REGEXP'[]:
如果在
b(item,id)

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