2012-01-27 65 views
0
SELECT 
    * 
FROM 
    (
     SELECT 
      qu.job_id AS `qu_job_id` , qu.engineer_id, qu.id AS `quote_id` , jb.author, jb.job_id, jb.job_title, SUBSTRING(jb.job_description, 1, 200) AS `short_description` , jb.image_ref, jb.timestamp 
     FROM 
      jobs AS `jb` 
     LEFT JOIN 
      quotes AS `qu` 
     ON 
     qu.job_id = jb.job_id 
     WHERE 
     jb.author = " . ID . " 
     GROUP BY 
     jb.job_id 
     ORDER BY 
     jb.timestamp DESC 
    ) AS `jobs` 
    LEFT JOIN 
    (
     SELECT 
     COUNT(id) AS `total_replies` , job_id 
     FROM 
     quote_comments 
     WHERE 
     job_id = jobs.job_id 
    ) AS `replies` 
    ON 
     replies.job_id = jobs.job_id    

我的問題使用結果從子查詢是否有可能(以上不作爲是工作)把這個結果從第一子查詢,以防止在第二比較? (即job_id = jobs.job_idSQL - 另一個子查詢

問候

編輯

(這裏作爲評論有更多的空間)

SELECT 
    qu.engineer_id, 
    qu.id AS `quote_id`, 
    jb.author, 
    jb.job_id, 
    jb.job_title, 
    SUBSTRING(jb.job_description, 1, 200) AS `short_description` , 
    jb.image_ref, 
    jb.timestamp, 
    count(qu.id) AS comment_count 
FROM 
    " . JOBS . " AS `jb` 
LEFT JOIN 
    " . QUOTES . " AS `qu` 
ON 
    qu.job_id = jb.job_id 
WHERE 
    jb.author = " . ID . " 
GROUP BY 
    jb.job_id, 
    qu.engineer_id, 
    qu.id, 
    jb.author, 
    jb.job_title, 
    SUBSTRING(jb.job_description, 1, 200), 
    jb.image_ref, 
    jb.timestamp 
ORDER BY 
    jb.timestamp DESC 

我最初的問題是不正確略。我實際上想要得到報價的數量,而不是報價評論。

上述建議在下面看起來似乎乍一看,但它返回的工作有多個報價submited×次數與每個報價計數爲1。有任何想法嗎?

+1

是的,它是可能的。首先,你不能在子查詢中使用ORDER BY。這是你得到的錯誤嗎? – 2012-01-27 20:06:42

+1

它看起來像你試圖得到一份工作,得到任何工作報價(或沒有),以及作業的報價評論數。如果這是正確的,我想我知道答案。 – Hasteur 2012-01-27 20:11:37

+0

我想要做的是從3個表中獲取信息。所有這三個在comman,job_id和author_id中都有兩個東西。我想要獲得所有工作,並且還要獲得1個查詢中每個工作收到的評論數量。 (p.s.順序工作正常) – 2012-01-27 20:11:44

回答

0
SELECT 
    qu.engineer_id, 
    qu.id AS `quote_id`, 
    jb.author, 
    jb.job_id, 
    jb.job_title, 
    SUBSTRING(jb.job_description, 1, 200) AS `short_description` , 
    jb.image_ref, 
    jb.timestamp, 
    count(qc.id) AS comment_count 
FROM 
    jobs AS `jb` 
LEFT JOIN quotes AS `qu` ON qu.job_id = jb.job_id 
LEFT JOIN quote_comments AS `qc` ON qu.job_id = qc.job_id 
WHERE 
    jb.author = " . ID . " 
GROUP BY 
    jb.job_id, 
    qu.engineer_id, 
    qu.id, 
    jb.author, 
    jb.job_title, 
    SUBSTRING(jb.job_description, 1, 200) 
    jb.image_ref, 
    jb.timestamp 
ORDER BY 
    jb.timestamp DESC 

這將消除子查詢解析並使您的總體查詢運行得更快。我刪除了報價工作ID,因爲我們正在加入,因此只需要拉一次。我注意到我們直接從工作中拼接引用評論。您可能希望通過報價,讓你看到有多少評論每帖有多少報價評論,而不是有整體的工作聯繫起來

+0

感謝上述小周,並像一個魅力工作。謝謝 – 2012-01-27 20:32:09

+0

等等,不,我不挑剔,因爲它沒有完全回答,我會在問題中解釋更多。 – 2012-01-27 20:37:44

+0

如果你將一個表'A'加入到2個表'B'和'C'中,這兩個表都與A有一對多的關係,然後你用A.something'做一個'group,在集合函數中會得到錯誤的結果。 – 2012-01-27 23:16:25

0
SELECT 
    jb.author, 
    jb.job_id, 
    jb.job_title, 
    SUBSTRING(jb.job_description, 1, 200) AS `short_description` , 
    jb.image_ref, 
    jb.timestamp, 
    count(qu.id) AS quote_count 
FROM 
    jobs AS `jb` 
LEFT JOIN quotes AS `qu` ON qu.job_id = jb.job_id 
WHERE 
    jb.author = " . ID . " 
GROUP BY 
    jb.job_id, 
    jb.author, 
    jb.job_title, 
    SUBSTRING(jb.job_description, 1, 200) 
    jb.image_ref, 
    jb.timestamp 
ORDER BY 
    jb.timestamp DESC 

這將拉動由ID撰寫,然後做的工作對提交的工作報價進行計數。 Unfortunateley獲得報價作業的數量,你必須從報價表

0

編輯您的第一個查詢離開過工程師ID和報價ID:

SELECT 
    * 
FROM 
    ( SELECT 
      qu.job_id AS `qu_job_id` , qu.engineer_id, qu.id AS `quote_id`, 
      jb.author, jb.job_id, jb.job_title, 
      SUBSTRING(jb.job_description, 1, 200) AS `short_description`, 
      jb.image_ref, jb.timestamp 
     FROM 
      jobs AS `jb` 
     LEFT JOIN 
      quotes AS `qu` 
     ON 
      qu.job_id = jb.job_id 
     WHERE 
      jb.author = " . ID . " 
     GROUP BY 
      jb.job_id 
           --- ORDER BY   --- not needed 
           --- jb.timestamp DESC --- here 
    ) AS `jobs` 
    LEFT JOIN 
    (
     SELECT 
      COUNT(*) AS `total_replies` , job_id 
     FROM 
      quote_comments 
           --- WHERE 
           --- job_id = jobs.job_id 
     GROUP BY    --- replacing the WHERE 
      job_id    --- with a GROUP BY 
    ) AS `replies` 
    ON 
     replies.job_id = jobs.job_id 
ORDER BY      --- order clause 
    timestamp DESC    --- moved here