2009-12-28 59 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%')如何獲得fol產量下降?

+------+------+-------+------------------------------------+ 
| 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

組合後,您需要使用必須在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)

一個綜合指數