2012-03-25 56 views
0

在下面的代碼中,我主要在做我想做的事情,我正在查詢屬性表,該表通過會場屬性錶鏈接到「場地」表,以提供多對多。如何使用此代碼查詢同一個表兩次(保留GROUP_CONCAT)?

我這樣做是爲了提高在單個場地頁面上顯示大型列表時的性能,其中我使用工廠來加載場地對象。到目前爲止,這個新通話爲我節省了很多時間。

首先我想知道爲什麼我必須使用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

如果一個場地只有一個屬性值,但場地和屬性之間存在一對多關係,哪一行是評級?他們全部? – Ami 2012-03-25 10:32:47

+0

@Ami,我認爲我的問題的這個子集回答你的問題? 「我正在查詢一個屬性表,通過一個場地表屬性表連接到'場地'表格,給出了多對多的」 – SaminOz 2012-03-25 12:04:40

+0

答案是? – Ami 2012-03-25 12:30:00

回答

1

對於你的第二個挑戰,我認爲解決的辦法是讓2加入到attribute表,就像一個如下:

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; 

上面的查詢應該給你的單獨評級結果集中的列。

現在對於您的第一個問題,您不必在GROUP_CONCAT中使用DISTINCT,除非同一場地中可能有多個具有相同名稱的屬性。如果對於一個給定的場地,永遠不可能有2個或更多具有相同名稱的屬性,則可以安全地避免DISTINCT。

希望它有幫助!

+0

感謝您的幫助。我已經標記了你,因爲這對我很有幫助,我不知道我可以用這種方式將「where」添加到聯接中 - 但是,a1.name AS等級的列正在返回所有調用的NULL值。這段代碼可能解釋了爲什麼「如果在LEFT JOIN的ON或USING部分右表沒有匹配的行,所有列都設置爲NULL的行用於右表」。但是,有值我可以通過在查詢的WHERE部分使用「AND a1.type ='rating'」來證明它 - 這明顯限制了查詢。 – SaminOz 2012-03-25 12:24:29

+0

如果在type =「rating」的屬性中有行,它應該反映在結果集中。順便說一下,你對LEFT JOIN的理解是正確的。有一個條件'v.status = 1';因此對於狀態爲1的場所,可能沒有「評級」屬性。請您驗證一下嗎? – Abhay 2012-03-25 12:40:34

相關問題