[英]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.