簡體   English   中英

如何從加入的MySQL表中進行選擇?

[英]How to select from joined MySQL tables?

我基本上有兩張桌子:

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'

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)上有復合索引b (item, id)后一個查詢會更快

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

還有另一種方法:

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';
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%');

我懷疑這表現得很好,但這對我來說似乎合乎邏輯。

你需要在group_concat上使用必須執行類似運算符的組之后。

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

請注意我只是在尋找您需要調整類似語句以滿足您的要求的任何o。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM