mysql - 如何使用此代码查询同一个表两次(保留 GROUP_CONCAT)?

标签 mysql

在下面的代码中,我正在查询一个属性表,该属性表通过提供多对多的venue_attribute表链接到“venues”表。

我这样做是为了提高在各个 field 页面上显示大型列表时的性能,我在其中使用工厂加载 field 对象。到目前为止,这个新电话节省了我很多时间。

首先,我想知道为什么我必须将 DISTINCT 与 GROUP_CONCAT 一起使用,以避免每个 field 在 a.name 下显示多个值?我没看到它在哪里连接两次?

我的第二个挑战是检索属性表中保存的评级值,与 GROUP_CONCAT 返回值分开。 (我已将表结构放在查询下方)。评级在 GROUP_CONCAT (a.name) 值内返回,但每个 field 只有一个,我需要在 select 语句中的单独列中显示它,例如 a. rating。我也许应该将评级值保存在 field 表中,如果不容易检索的话,我也会这样做 - 但我有兴趣了解 MYSQL 可以做什么,而且我的技能水平相当基础。

感谢您的宝贵时间。

SELECT v.venue_id, v.name, v.suburb, v.venue_email, v.venue_phone, GROUP_CONCAT(DISTINCT a.name) AS attributes, v.review_count, vi.image_thumb_path
FROM venues AS v
LEFT JOIN venue_attribute AS va ON v.venue_id = va.venue_id
LEFT JOIN attribute AS a ON a.att_id = va.attribute_id
LEFT JOIN venue_review AS vr ON vr.venue_id = v.venue_id
LEFT JOIN venue_image AS vi ON vi.venue_id = v.venue_id
WHERE v.status = 1
GROUP BY v.name;

Table attribute
===============
att_id, type, name, abbreviation, synonyms, description, scope
---------------
att_id           int(11) PK
type             enum('transport','purpose','parking','site_control','authorisations','permissions','facilities','rating')
name             varchar(255)
abbreviation     varchar(32)
synonyms         varchar(255)
description      mediumtext
scope            enum('global')

最佳答案

对于第二个挑战,我认为解决方案是对 attribute 表进行 2 个联接,如下所示:

SELECT v.venue_id, v.name, v.suburb, v.venue_email, v.venue_phone, GROUP_CONCAT(DISTINCT a.name) AS attributes, v.review_count, vi.image_thumb_path, a1.name as rating
FROM venues AS v
LEFT JOIN venue_attribute AS va ON v.venue_id = va.venue_id
LEFT JOIN attribute AS a ON a.att_id = va.attribute_id
LEFT JOIN attribute AS a1 ON a1.att_id = va.attribute_id AND a1.type = 'rating'
LEFT JOIN venue_review AS vr ON vr.venue_id = v.venue_id
LEFT JOIN venue_image AS vi ON vi.venue_id = v.venue_id
WHERE v.status = 1
GROUP BY v.name;

上面的查询应该在结果集中的单独列中为您提供评级。

现在,对于您的第一个问题,您不必将 DISTINCT 与 GROUP_CONCAT 一起使用,除非同一地点可能有多个同名属性。如果对于给定 field ,不可能有 2 个或更多同名属性,您可以安全地避免 DISTINCT。

希望对你有帮助!

关于mysql - 如何使用此代码查询同一个表两次(保留 GROUP_CONCAT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859266/

相关文章:

python - SQL ORDER BY 时间戳,相同的值

MySql After Update 触发器执行顺序

php - httppost mysql 为空

mysql - 查找列中最常见的条目 - SQL

mysql - 如何在插入 MySQL 之前检查字符串长度?

Mysql 存储函数性能问题

php - SQL - 搜索表单中的多个表

MySQL:驱动程序从 5 更新到 8 后,LOAD DATA LOCAL INFILE 不起作用

mysql - 加入动态sql

php - sql使用偏移行获取没有足够的结果