Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用此代码查询同一个表两次(保持组一致)?_Mysql - Fatal编程技术网

Mysql 如何使用此代码查询同一个表两次(保持组一致)?

Mysql 如何使用此代码查询同一个表两次(保持组一致)?,mysql,Mysql,在下面的代码中,我正在查询一个属性表,该属性表通过一个提供多对多的场馆属性表链接到“场馆”表 我这样做是为了在各个场馆页面上显示一个大列表时提高性能,我使用factory加载场馆对象。到目前为止,这个新电话为我节省了很多时间 首先,我想知道为什么我必须使用DISTINCT with GROUP_CONCAT来避免在每个场馆的名称下显示多个值?我看不出它在哪里连接了两次 我的第二个挑战是检索attributes表中保存的评级值,与GROUP_CONCAT返回值分开。(我已将表结构放在查询下面)。评

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

我这样做是为了在各个场馆页面上显示一个大列表时提高性能,我使用factory加载场馆对象。到目前为止,这个新电话为我节省了很多时间

首先,我想知道为什么我必须使用DISTINCT with GROUP_CONCAT来避免在每个场馆的名称下显示多个值?我看不出它在哪里连接了两次

我的第二个挑战是检索attributes表中保存的评级值,与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')

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

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;
上述查询应在resultset的单独列中为您提供评级

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


希望有帮助

如果一个场馆只有一个attribute.rating值,但场馆和属性之间存在一对多关系,那么评级在哪一行?都是吗?@Ami,我想这部分问题回答了你的问题?“我正在查询由场馆属性表链接到‘场馆’表的属性表,提供多对多”感谢您的帮助。我已经标记了您,因为这对我很有帮助,我不知道我可以以这种方式将类似“where”的条件添加到连接中-但是,列a1.name as rating为所有调用返回空值。这段来自mysql的代码片段可能解释了为什么“如果ON或USING部分中的右表没有匹配行,那么右表将使用所有列都设置为NULL的行。”,但是有一些值,我可以使用“and a1.type='rating'”来证明这一点在查询的WHERE部分-这显然限制了查询。若在属性WHERE type=“rating”中有行,那个么它应该已经反映在结果集中。顺便说一下,你的理解是对的。存在一个where条件
v.status=1
;因此,状态为1的场馆可能都没有“评级”属性。你能核实一下吗?