- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个规范化的数据库,我正在尝试使用 JOIN 和 GROUP_CONCAT 从多个表中返回数据。
问题:使用 GROUP_CONCAT 复制行。我不能使用 DISTINCT,因为某些数据(成分制造商)确实需要复制。
这是我当前的查询和数据库结构 (SQL Fiddle):
SELECT recipe.*,
GROUP_CONCAT(recipe_detail.ingredient_id) AS iid,
GROUP_CONCAT(ingredient.name) AS iname,
GROUP_CONCAT(ingredient_mfr.abbr) AS mabbr,
GROUP_CONCAT(recipe_tag.name) AS tag
FROM recipe
LEFT JOIN recipe_detail
ON recipe.id = recipe_detail.recipe_id
LEFT JOIN ingredient
ON recipe_detail.ingredient_id = ingredient.id
LEFT JOIN ingredient_mfr
ON ingredient.mfr_id = ingredient_mfr.id
LEFT JOIN recipe_tagmap
ON recipe.id = recipe_tagmap.recipe_id
LEFT JOIN recipe_tag
ON recipe_tagmap.tag_id = recipe_tag.id
WHERE recipe.user_id = 1
GROUP BY recipe.id
recipe
+------------+------------+-----------+
| id | name | user_id |
+============+============+===========+
| 1 | Test123 | 1 |
+------------+------------+-----------+
| 2 | Test456 | 1 |
+------------+------------+-----------+
| 3 | Test789 | 1 |
+------------+------------+-----------+
recipe_detail
+------------+---------------+
| recipe_id | ingredient_id |
+============+===============+
| 1 | 193 |
+------------+---------------+
| 1 | 194 |
+------------+---------------+
| 2 | 16 |
+------------+---------------+
| 3 | 277 |
+------------+---------------+
ingredient
+------------+---------------+---------+
| id | name | mfr_id |
+============+===============+=========+
| 16 | Gin | 4 |
+------------+---------------+---------+
| 193 | Fig | 3 |
+------------+---------------+---------+
| 194 | Tea | 3 |
+------------+---------------+---------+
| 277 | Nut | 2 |
+------------+---------------+---------+
ingredient_mfr
+------------+------------+
| id | abbr |
+============+============+
| 2 | TFA |
+------------+------------+
| 3 | FA |
+------------+------------+
| 4 | LOR |
+------------+------------+
recipe_tag
+------------+------------+
| id | name |
+============+============+
| 1 | one |
+------------+------------+
| 2 | two |
+------------+------------+
| 3 | three |
+------------+------------+
| 4 | four |
+------------+------------+
| 5 | five |
+------------+------------+
| 6 | six |
+------------+------------+
| 7 | seven |
+------------+------------+
| 8 | eight |
+------------+------------+
| 9 | nine |
+------------+------------+
recipe_tagmap
+------------+---------------+---------+
| id | recipe_id | tag_id |
+============+===============+=========+
| 1 | 1 | 1 |
+------------+---------------+---------+
| 2 | 1 | 2 |
+------------+---------------+---------+
| 3 | 1 | 3 |
+------------+---------------+---------+
| 4 | 2 | 4 |
+------------+---------------+---------+
| 5 | 2 | 5 |
+------------+---------------+---------+
| 6 | 2 | 6 |
+------------+---------------+---------+
| 7 | 3 | 7 |
+------------+---------------+---------+
| 8 | 3 | 8 |
+------------+---------------+---------+
| 9 | 3 | 9 |
+------------+---------------+---------+
对于我当前的查询,我的结果如下所示:
+------+---------+--------------+----------- ----+---------------+------------------+
| id | name | iid | iname | mabbr | tag |
+======+=========+==============+================+===============+==================+
| 1 | Test123 | 193,193,193, | Fig, Fig, Fig, | FA, FA, FA, | one, two, three, |
| | | 194,194,194 | Tea, Tea, Tea | FA, FA, FA | one, two, three |
+------+---------+--------------+----------------+---------------+------------------+
| 2 | Test456 | 16,16,16 | Gin, Gin, Gin | LOR, LOR, LOR | four, five six |
+------+---------+--------------+----------------+---------------+------------------+
| 3 | Test789 | 277,277,277 | Nut, Nut, Nut | TFA, TFA, TFA | seven,eight,nine |
+------+---------+--------------+----------------+---------------+------------------+
我希望我的结果看起来像什么:
+------+---------+--------------+----------- ----+---------------+------------------+
| id | name | iid | iname | mabbr | tag |
+======+=========+==============+================+===============+==================+
| 1 | Test123 | 193, 194 | Fig, Tea | FA, FA | one, two, three, |
+------+---------+--------------+----------------+---------------+------------------+
| 2 | Test456 | 16 | Gin | LOR | four, five six |
+------+---------+--------------+----------------+---------------+------------------+
| 3 | Test789 | 277 | Nut | TFA | seven,eight,nine |
+------+---------+--------------+----------------+---------------+------------------+
如您所见,多个标签的存在会导致成分数据重复。多种成分的存在会导致标签重复。我曾尝试使用 DISTINCT,但有时我会有多种成分,其中每一种都会返回它自己的“mabbr”,这可能与其他成分相同(请参阅预期结果的第一行)。使用 DISTINCT,它只会返回该“mabbr”的一个实例。
是否可以对我的查询进行更改以实现我想做的事情?
最佳答案
您可以通过将 tag
分组提取到它自己的子查询中来解决此问题:
SELECT
recipe.*,
GROUP_CONCAT(recipe_detail.ingredient_id) AS iid,
GROUP_CONCAT(ingredient.name) AS iname,
GROUP_CONCAT(ingredient_mfr.abbr) AS mabbr,
(
SELECT GROUP_CONCAT(recipe_tag.name)
FROM recipe_tag
INNER JOIN recipe_tagmap
ON recipe_tagmap.tag_id = recipe_tag.id
WHERE recipe_tagmap.recipe_id = recipe.id
) AS tag
FROM recipe
LEFT JOIN recipe_detail
ON recipe.id = recipe_detail.recipe_id
LEFT JOIN ingredient
ON recipe_detail.ingredient_id = ingredient.id
LEFT JOIN ingredient_mfr
ON ingredient.mfr_id = ingredient_mfr.id
WHERE recipe.user_id = 1
GROUP BY recipe.id
(示例 fiddle)
关于MySQL - GROUP_CONCAT 返回重复数据,不能使用 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451000/
假设你有 Select group_concat(distinct tag.title) as tagTitles group_concat(distinct tag.id) as tagIds ar
我正在建立一个销售鞋子的网上商店。我正在尝试编写一个命令来显示 1 个特定运动鞋的每种尺寸的数量。 这是我的 ER 图 Link to my ER-Diagram can be seen here:
有可能吗?我想要得到的是这样的: +-------------------------------+ | data 1 (another1, another2); | | data 2 (anoth
我正在分析一些查询,并在尝试根据 user_id 从不同的表中提取多个字段时注意到一些有趣的结果。考虑下表: +------------------------+------------------+
不确定标题是否正确解释了情况,但我会尽力在这里解释。 我有一个表,其中有 3 个字段链接到其他表,我想按以下方式对所有行进行分组: item_id, user_id, group_id 1
SELECT CONCAT(`date`,',',`viewcount`) FROM `stat` WHERE `stat`.`id` = 1 AND `channelstat`.`date` B
这是我第一次使用 stackoverflow,..对我温柔点;) 当在 map 表上使用多个 JOIN 时,从 GROUP_CONCAT 获取重复结果几乎没有问题。 解释这个并不容易,但我会尝试: 我
我有以下查询: SELECT files.file_name, files.locked, projects.project_name, group_concat( versions.version,
我想列出所有用户及其对应的用户类别。这是我的表格的简化版本 CREATE TABLE users ( user_id INT NOT NULL AUTO_INCREMENT, user
MYSQL group_concat() 函数默认忽略空列,但不忽略空字符串列。我有一个 mediumtext 类型的字段,而不是 null。当我在该查询上使用 group_concat 函数时,生成
是否可以使用 Mysql 获取前 n(比如一列的 10 行)行的逗号分隔值? 我有一个查询要获取大于 CURDATE() 的数据。它将返回超过 100 行的结果。我想要的是,GROUP_CONCAT
我刚刚了解到 group_concat和 order by , group by ,现在我正在尝试将它们应用于查询谋杀案。即,到下面的这个以获取所有参与者和目标。 SELECT DISTINCT ?i
在 BigQuery 中创建了以下查询: SELECT date, userId, SUM(totals.visits) totalvisits, GROUP_CONCAT(devic
这是我的 SQL 操作: select `id_ifc_espaces`,GROUP_CONCAT(DISTINCT `nom_espace`) as nom_espace ,GROUP_CONC
我使用 GROUP_CONCAT 来获得由逗号分割的结果( , ),但是当我看到时, GRUP_CONCAT仅返回 205 拆分的数字,但在数据库中有 2448 结果(不同 aid )。这是我的查询:
我想在 table A 上做一个 SELECT,它有: table_a: ╔══════════╦════════╗ ║ GROUP_ID ║ NAME ║ ╠══════════╬═══════
我想根据messageid group_concate image_id 和small_pic_path 路径。 但是 group concate 显示所有 image_id 和第一个 message
我有 table id | industry_id | type | key 1 1 0 word1 2 1 1 wor
我的查询是这样的 SELECT * FROM semesters WHERE student_id = 434 AND marks_id <= 576 AND semester_id <= 23
在 mysql 中是否有 GROUP_CONCAT 的替代方案。由于 GROUP_CONCAN 的最大长度约束是 1024,我需要一个替代方案。我不能更改 GROUP_CONCAN_MAX_LENGT
我是一名优秀的程序员,十分优秀!