2012-01-11 115 views
3

我如何使用MySQL來計算一個左連接?如何使用MySQL以COUNT進行LEFT JOIN?

我有兩個表,有時評級表中沒有相片收視率,所以我認爲LEFT JOIN需要的,但我也有一個COUNT聲明..

照片

id name  src 
1 car   bmw.jpg 
2 bike  baracuda.jpg 

(picid與照片ID外鍵)

id picid ratersip 
4 1  81.0.0.0 
6 1  84.0.0.0 
7 2  81.0.0.0 

他用戶只能用IP對一個圖像進行評分。

我想按最高評分的順序組合這兩張表。新表

聯合

id name src   picid 
1 car  bmw.jpg  1 
2 bike baracuda.jpg 2 

(寶馬是收視率最高的)

我的MySQL代碼:

SELECT * FROM photos 
LEFT JOIN ON photos.id=loves.picid 
ORDER BY COUNT (picid); 

我的PHP代碼:(更新和補充 - 工作實例。 ..)

$sqlcount = "SELECT p . * 
FROM `pics` p 
LEFT JOIN (

SELECT `loves`.`picid`, count(1) AS piccount 
FROM `loves` 
GROUP BY `loves`.`picid` 
)l ON p.`id` = l.`picid` 
ORDER BY coalesce(l.piccount, 0) DESC"; 

$pics = mysql_query($sqlcount); 
+0

謝謝大家。以上解決方案 – TheBlackBenzKid 2012-01-11 17:01:00

+0

@TheBlackBenzKid請不要**添加您對問題的回答....要麼創建一個新的答案,並在評論中引用它,或者根本不要這樣做...... – Neal 2012-01-11 17:03:22

回答

4

的MySQL允許您將僅由id柱:

select 
    p.* 
from 
    photos p 
    left join loves l on 
     p.id = l.picid 
group by 
    p.id 
order by 
    count(l.picid) 

話雖這麼說,我知道,MySQL是在group by真的很差,所以您可以嘗試將loves計數放入您的連接的子查詢中以優化它:

select 
    p.* 
from 
    photos p 
    left join (select picid, count(1) as piccount from loves group by picid) l on 
     p.id = l.picid 
order by 
    coalesce(l.piccount, 0) 

我沒有MySQL實例來測試哪個更快,所以測試它們兩者。

+0

hehe'+ 1'^_ ^巧妙:-P – Neal 2012-01-11 16:41:31

+0

第二個查詢對我來說工作得更快。我在最後一個支架後加了DESC,所以我可以從最高到最低排序。謝謝。唯一的問題是沒有轉換爲PHP – TheBlackBenzKid 2012-01-11 16:50:23

+0

我在上面添加了PHP代碼。請你可以告訴我。 – TheBlackBenzKid 2012-01-11 16:56:19

2

您需要使用子查詢:

SELECT id, name, src FROM (
    SELECT photos.id, photos.name, photos.src, count(*) as the_count 
    FROM photos 
    LEFT JOIN ON photos.id=loves.picid 
    GROUP BY photos.id 
) t 
ORDER BY the_count 
1
select 
     p.ID, 
     p.name, 
     p.src, 
     PreSum.LoveCount 
    from 
     Photos p 
     left join (select L.picid, 
          count(*) as LoveCount 
         from 
          Loves L 
         group by 
          L.PicID) PreSum 
      on p.id = PreSum.PicID 
    order by 
     PreSum.LoveCount DESC 
+0

我喜歡這個代碼和縮進。所以我給了一個加分。易於閱讀。 – TheBlackBenzKid 2012-01-11 16:51:18

+0

@TheBlackBenzKid,欣賞它......從這些年來編寫SQL的,所以很多有這樣的模糊,這使得它很難爲以下...的主要「選擇,來自哪裏,GROUP BY,ORDER BY,具有」在一個層面上保持所有領域和/或標準更容易識別。 – DRapp 2012-01-11 16:53:36

0

我相信,你只需要加入的數據,並在你選擇做一個計數(*)。確保你指定了哪個表格你想用於ambigous列。另外,不要忘記在計數(*)時使用按功能分組。以下是我在MS SQL上運行的示例查詢。

Select CmsAgentInfo.LOGID, LOGNAME, hCmsAgent.SOURCEID, count(*) as COUNT from hCmsAgent 
LEFT JOIN CmsAgentInfo on hCmsAgent.logid=CmsAgentInfo.logid 
where SPLIT = '990' 
GROUP BY CmsAgentInfo.LOGID, LOGNAME, hCmsAgent.SOURCEID 

這個例子的結果是這樣的。

77615 SMITH, JANE 1 36 
29422 DOE, JOHN 1 648 

希望有所幫助。祝你好運。