在下面的代码中,主要是我想做的事情,我正在查询链接到场地的属性表' table_attribute表的表格给出了多对多。
我这样做是为了在单个场地页面上显示大型列表时提高性能,我使用工厂来加载场地对象。到目前为止,这个新的电话节省了我很多时间。
首先,我想知道为什么我必须使用DISTINCT和GROUP_CONCAT来避免在a.name下每个场地显示多个值?我不知道它加入两次的地方?
我的第二个挑战是检索属性表中保存的评级值,与GROUP_CONCAT返回值分开。 (我把表结构放在查询下面)。评级在GROUP_CONCAT(a.name)值内返回,但每个场地只有一个,我需要在select语句中的单独列中显示它,例如a.rating。我或许应该在场地表中保留评级值,并且如果它不容易检索的话,我会感兴趣 - 但是我有兴趣看看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')
答案 0 :(得分:1)
对于您的第二个挑战,我认为解决方案是对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一起使用,除非同一场地可能存在多个具有相同名称的属性。如果对于给定的场地,永远不可能有2个或更多具有相同名称的属性,则可以安全地避免使用DISTINCT。
希望它有所帮助!