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

时间:2012-03-25 09:53:06

标签: mysql

在下面的代码中,主要是我想做的事情,我正在查询链接到场地的属性表' 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')

1 个答案:

答案 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。

希望它有所帮助!