簡體   English   中英

GROUP_CONCAT和帶有WHERE子句的INNER JOIN

[英]GROUP_CONCAT and INNER JOIN with WHERE clause

我在獲取數據時遇到問題。 我想找到所有包含where子句中的標志的課程,並獲取它包含的所有標志。

課程表記錄:

+----+----------+
| id |   name   |
+----+----------+
| 1  | Spring   |
| 2  | Hibernate|
| 3  | C#       |
+----+----------+

course_flags表的記錄:

+----+----------+----------+
| id |course_id |  flag_id |
+----+----------+----------+
| 1  |     1    |     1    |
| 2  |     1    |     2    |
| 3  |     2    |     1    |
+----+----------+----------+

標志表的記錄:

+----+------------+
| id |    name    |
+----+------------+
| 1  | promocja   |
| 2  |last minute |
+----+------------+

我的查詢

SELECT course.id, course.name,
       GROUP_CONCAT(Flag.id SEPARATOR ',') as flags
FROM course
INNER JOIN course_flags ON 
    course.id = course_flags.course_id
INNER JOIN flag ON 
    flag.id = course_flags.flag_id
WHERE flag.name LIKE 'promocja'
GROUP BY Course.id

不幸的是,我的數據庫引擎返回的記錄在flags列中帶有一個標志:

+----+----------+----------+
| id |   name   |   flags  |
+----+----------+----------+
| 1  | Spring   |     1    |
| 2  | Hibernate|     1    |
+----+----------+----------+

我曾希望得到以下結果:

+----+----------+----------+
| id |   name   |   flags  |
+----+----------+----------+
| 1  | Spring   |   1,2    |
| 2  | Hibernate|    1     |
+----+----------+----------+

問題我如何得到?

提前致謝!

WHERE子句分組之前限制記錄; HAVING子句會限制分組后的結果:

SELECT   course.id, course.name, GROUP_CONCAT(Flag.id) flags
FROM     course
    JOIN course_flags ON course_flags.course_id = course.id
    JOIN flag ON flag.id = course_flags.flag_id
GROUP BY Course.id
HAVING   SUM(flag.name = 'promocja')

sqlfiddle上看到它。

像這樣簡單地使用聯接的問題是您的WHERE子句將減少可用於結果集的標志。 您真正需要做的是使用子選擇首先確定具有此標志的ID,然后使用該組ID為每個ID確定標志。 可能看起來像這樣:

SELECT
    c.id AS id,
    c.name AS name,
    GROUP_CONCAT(cf.flag_id) AS flags
FROM course AS c
INNER JOIN course_flag AS cf
    ON c.id = cf.course_id
INNER JOIN 
    (SELECT cf2.course_id AS id
    FROM course_flags AS cf2
    INNER JOIN flag AS f
    WHERE f.name = ?) AS ids
    ON c.id = ids.id
GROUP BY c.id

? 是您要查詢的標志名稱。 注意我在WHERE子句中也使用了=這里,而不是LIKE因為您甚至沒有使用LIKE功能(沒有通配符)。

暫無
暫無

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

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