- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
场景
我想获取用户拥有的注册语言以及所有用户详细信息,我当前的问题是当我GROUP_CONCAT
目标列时,值会重复。有人可以解释一下为什么这些值是重复的吗?
我的表格
// users
+------+-------------+------------+----------------+--------------+
| id | firstname | lastname | email | created_at |
+------+-------------+------------+----------------+--------------+
| 10 | John | Doe | john@doe.com | 2014-10-21 |
+------+-------------+------------+----------------+--------------+
// teachers
+------+-----------+------------------+-------------------+
| id | user_id | years_teaching | months_teaching |
+------+-----------+------------------+-------------------+
| 35 | 10 | 3 | 6 |
+------+-----------+------------------+-------------------+
// teacher_languages
+------+--------------+---------------+----------+---------+
| id | teacher_id | language_id | status | views |
+------+--------------+---------------+----------+---------+
| 52 | 35 | 5 | 1 | 80 |
+------+--------------+---------------+----------+---------+
| 53 | 35 | 7 | 1 | 40 |
+------+--------------+---------------+----------+---------+
// translators
+------+-----------+------------------------+---------------------+
| id | user_id | certified_translator | accept_travelling |
+------+-----------+------------------------+---------------------+
| 23 | 10 | 0 | 1 |
+------+-----------+------------------------+---------------------+
// translator_languages
+------+-----------------+---------------+----------+---------+
| id | translator_id | language_id | status | views |
+------+-----------------+---------------+----------+---------+
| 52 | 23 | 5 | 1 | 27 |
+------+-----------------+---------------+----------+---------+
| 53 | 23 | 7 | 1 | 82 |
+------+-----------------+---------------+----------+---------+
// languages
+------+-----------------+------------+
| id | language_text | language |
+------+-----------------+------------+
| 5 | English | EN |
+------+-----------------+------------+
| 7 | French | FR |
+------+-----------------+------------+
当前查询
这是产生重复值的查询
SELECT
u.*,
// teacher languages
GROUP_CONCAT(l.language_text) AS teacher_languages,
GROUP_CONCAT(tl.status) AS teacher_languages_status,
GROUP_CONCAT(tl.views) AS teacher_language_views
// translator languages
GROUP_CONCAT(trl_txt.language_text) AS translator_languages,
GROUP_CONCAT(trl.status) AS translator_languages_status,
GROUP_CONCAT(trl.views) AS translator_language_views
FROM
users u
LEFT JOIN
teachers t ON t.user_id = u.id
LEFT JOIN
teacher_languages tl ON tl.teacher_id = t.id
LEFT JOIN
languages l ON l.id = tl.language_id
LEFT JOIN
translators tr ON tr.user_id = u.id
LEFT JOIN
translator_languages trl ON trl.teacher_id = t.id
LEFT JOIN
languages trl_txt ON trl_txt.id = trl.language_id
GROUP BY
u.id
ORDER BY
u.created_at
结果
[0] =>
[id] => 10
[firstname] => 'John'
[lastname] => 'Doe'
[email] => 'john@doe.com'
[created_at] => '2014-10-21'
[teacher_languages] => 'English, English, French, French'
[teacher_language_status] => '1,1,1,1'
[teacher_language_views] => '80,40,80,40'
[translator_languages] => 'English, French, English, French'
[translator_language_status] => '1,1,1,1'
[translator_language_views] => '27,82,27,82'
最佳答案
问: 有人可以解释一下为什么这些值是重复的。
答:为了更好地理解值重复的原因,请运行不带 GROUP_CONCAT
和 GROUP BY
的查询。然后,您的查询会产生某种笛卡尔积:因为结果中每个老师和每个译者都有两种语言,所以您会得到所有可能的组合:
teacher_languages translator_languages----------------- --------------------English EnglishEnglish FrenchFrench EnglishFrench French
GROUP_CONCAT
just concatenates all column values and you get:
[teacher_languages] => 'English, English, French, French'
[translator_languages] => 'English, French, English, French'
<小时/>
避免重复的可能解决方案之一是使用子查询:
SELECT
u.*,
a.teacher_languages, a.teacher_languages_status, a.teacher_language_views,
b.translator_languages, b.translator_languages_status, b.translator_language_views
FROM users u
LEFT JOIN (
SELECT
t.user_id,
-- teacher languages
GROUP_CONCAT(tl_txt.language_text) AS teacher_languages,
GROUP_CONCAT(tl.status) AS teacher_languages_status,
GROUP_CONCAT(tl.views) AS teacher_language_views
FROM teachers t
LEFT JOIN teacher_languages tl ON tl.teacher_id = t.id
LEFT JOIN languages tl_txt ON tl_txt.id = tl.language_id
GROUP BY t.user_id
) a ON a.user_id = u.id
LEFT JOIN (
SELECT
tr.user_id,
-- translator languages
GROUP_CONCAT(trl_txt.language_text) AS translator_languages,
GROUP_CONCAT(trl.status) AS translator_languages_status,
GROUP_CONCAT(trl.views) AS translator_language_views
FROM translators tr
LEFT JOIN translator_languages trl ON trl.teacher_id = tr.id
LEFT JOIN languages trl_txt ON trl_txt.id = trl.language_id
GROUP BY tr.user_id
) b ON b.user_id = u.id
ORDER BY u.created_at
关于mysql - SQL - select concat 与表连接中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479212/
在 的 React 组件中菜单,我需要设置selected反射(reflect)应用程序状态的选项的属性。 在 render() , optionState从状态所有者传递给 SortMenu 组件
我是初级 Ruby-mysql 程序员,我想知道如何使我的(存储过程)查询结果更快.. 这是我的存储过程我正在使用 SQL_CACHE.. 但我不确定.. 缓存使我的过程更快.. : ( DROP
我一直在 Python 中进行套接字编程,以使用 select.select(rfile, wfile, xlist[, timeout]) 处理由已连接的客户端套接字列表发出的请求,并且我还想用 J
我试图通过用空格填充文本来创建下拉列表中的列效果,如下例所示: [Aux1+1] [*] [Aux1+1] [@Tn=PP] [Main] [*] [Main A
我为 MySQL 编写了以下查询: SELECT subquery.t1_column1, subquery.t2_id, MAX(subquery.val) FROM ( S
为什么我们要用 select 标签来编写.attr('selected','selected') 例如: $('#countryList option').filter(function () {
Lokalizacja: Gdańsk Rzeszów Wrocław 不知道发生了什么,但在那种情况下没有选择的选项,我必须从列表中选择一些东西。当我从选
我的表单中有两个选择字段。第一个是单选,另一个是多选。现在我想做的是根据单选中所选的选项,使用给定的数据选择多选中的选项。为此,我在单选更改时触发 ajax 请求: $.ajax({ type
我在 Firefox 5 中发现了一个奇怪的错误(我现在无法访问 4)。但是,我认为它可能在 Firefox 4 中工作,因为我刚买了一台新电脑,而且我不记得以前见过这个错误。 我有几个选择框。所选值
此 SQL 有何不同: 第一个: select * from table_1 a join table_2 b on a.id = b.acc_id 第二个: select * f
预选 的最佳做法是什么?在 ? 根据不同的网站,两者都有效。但是哪个更好呢?最兼容? Foo Bar 最佳答案 如果您正在编写 XHTML,则 selected="selected" 是必需的。 如
我使用 Angular JS 创建了一个多选选择框:下面是相同的代码: JS: $scope.foobars = [{ 'foobar_id': 'foobar01', 'name':
我在 jqGrid 中有几列 edittype="select"。如何读取特定行中当前选定值的选项值? 例如:当我提供以下选项时,如何获得 FedEx 等的“FE” editoption: { val
这是我更大问题的精简查询,但要点是我试图内部联接到一个选择,其中选择受到外部选择的限制。那可能吗?我在内部选择上收到有关多部分标识符 S.Item 和 S.SerialNum 的错误。 要点是这样的,
如果chat.chat_type IS NULL,我想选择user.*,但如果chat.chat_type = 1 我想选择组。* SELECT CASE WHEN ch
我正在编写一个小脚本来测试表单在提交之前是否已被更改。所以我可以使用普通输入(文本、文本区域等): if(element.defaultValue != element.value) { al
我正在尝试为 Prototype 编写一个插件,用户在其中单击下拉菜单并将其替换为多选元素。我快完成了。在用户选择他们想要显示的内容并将表单提交到同一页面之前,一切都很好。我正在使用 PHP 来使用
你如何在 MongoDB 中进行嵌套选择,类似于 SELECT id FROM table1 WHERE id IN (SELECT id FROM table2) 最佳答案 MongoDB 尚不具备
我有以下用于选择下拉列表的代码: {{unit.Text}} UnitOfMeasurements 数组中的每一项看起来像这样: Selected: false Text: "lb" Va
我正在尝试使用[选定]和[ngValue]来设置表单中包含对象的选择标记的默认值。但出于某种原因,它们似乎无法相提并论。。示例代码:。这段代码最终只显示空白作为缺省值。如果删除[ngValue],它就
我是一名优秀的程序员,十分优秀!