在下面的代码中,我正在查询一个属性表,该属性表通过提供多对多的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/