2011-08-03 42 views
2

我靠近這一點拉我的頭髮。這是我正在處理的查詢:這是一個MySQL錯誤還是我瘋了?查詢沒有返回足夠的結果

  SELECT 
      *, 
      GROUP_CONCAT(DISTINCT d.title SEPARATOR ', ') AS departments, 
      MAX(d.department_id) AS department_id, 
      CONCAT(friendly_last_name, ', ', friendly_first_name) AS professor_name, 
      IF(p.reviews = 0, "", p.quality) AS quality, 
      IF(p.reviews = 0, "", p.reviews) AS reviews, 
      IF(p.reviews = 0, "", p.ease) AS ease, 
      u.url 
     FROM 
      educational.professors_departments 
      LEFT JOIN educational.professors p USING (professor_id) 
      LEFT JOIN educational.departments d USING (department_id) 
      LEFT JOIN educational.universities u ON (p.university_id = u.university_id) 
     WHERE 
      p.university_id = 3231 
      AND d.department_id IN ('91') 
     GROUP BY 
      professor_id 
     ORDER BY p.friendly_last_name ASC, p.friendly_first_name ASC 

當我按原樣運行該查詢時,得到101個結果。如果我在查詢的末尾添加一個簡單的LIMIT 20,則突然查詢返回一個結果。

好像這並不奇怪,如果我將LIMIT 20更改爲LIMIT 25,我會收到25個結果。是否有一些神奇的東西,我錯過了這個?我不能爲我的生活弄清楚。

P.S. - 我試過SQL_NO_CACHE無濟於事。 P.P.S. - 如果我刪除整個ORDER BY子句,但保留LIMIT 20 ...我得到20個結果

+0

我使用SQLYog獲得相同的結果,沒有直接在shell中嘗試,但SQLYog沒有做任何有趣的事情處理和理論上應該完全一樣。 –

+0

是否有可能實際獲得前20個結果的空值,並且它們沒有顯示爲shell中的文本,或者是否從shell中獲得'x rows returned'消息? – dfb

+0

SQLYog說「1行返回」,但只是爲了確保我將它運行在一個shell中,並獲得了一行「集合中的一行」 –

回答

2

我只能猜測引擎正在盡力猜測一些元素...您已經離開了連接不相信是你真正想要的......只是NORMAL加入...我首先試着對你的查詢進行一次EXPLAIN,看看它出現了什麼,可能會顯示與索引,全表掃描等的洞察力...

此外,使用select *通常是不好的,懶惰的查詢。獲取你想要和期望的列。如果一個結構發生了變化,而你依靠*,那麼你將來可能無法預見到結果。

我會重組如下,看到的結果並檢查其EXPLAIN

SELECT STRAIGHT_JOIN 
     p.Professor_ID, 
     CONCAT(p.friendly_last_name, ', ', p.friendly_first_name) AS professor_name, 
     GROUP_CONCAT(DISTINCT d.title SEPARATOR ', ') AS departments, 
     MAX(d.department_id) AS department_id, 
     IF(p.reviews = 0, "", p.quality) AS quality, 
     IF(p.reviews = 0, "", p.reviews) AS reviews, 
     IF(p.reviews = 0, "", p.ease) AS ease, 
     u.url 
    FROM 
     educational.professors p 
     JOIN educational.professors_departments pd 
      on p.Professor_ID = pd.Professor_ID 
      JOIN educational.departments d 
       on pd.Department_ID = d.Department_ID 
       AND d.department_id IN ('91') 
     JOIN educational.universities u 
      ON p.university_id = u.university_id 
    WHERE 
     p.university_id = 3231 
    GROUP BY 
     p.professor_id 
    ORDER BY 
     p.friendly_last_name ASC, 
     p.friendly_first_name ASC 
    LIMIT 20 

看你的IF()子句質量,評價,緩解......是你故意只在P得到這些值僅。所有3個元素的評論= 0 ...或者他們應該代表每個值的列...

+0

使用正常連接嘗試獲得了相同的結果。 SELECT *在那裏用於調試,我沒有在開發中使用它(但是我確實很欣賞你對細節的關注)。您的查詢似乎工作。是的,我打算使用p.reviews = 0,因爲如果p.reviews = 0,p.quality和p.ease沒有任何關聯。試圖找出你的查詢是如何使它工作的。 –

+0

@Colin Morelli,無論如何,STRAIGHT_JOIN可以幫助解決複雜的查詢結構。 – DRapp

+0

先生,您是一位天才......更不用說英雄了,因爲您只是挽救了我的頭髮。畢竟是說完了,我的查詢(不管相信與否)的問題是JOIN子句中USING與ON的區別(嘗試了其他所有更改,這是唯一有所作爲的部分)。但是,我使用了重組查詢,因爲它在我的基準測試中跑得更快。謝謝。 –

相關問題