2012-01-11 7 views
3

MySQLを使用してLEFT JOINをカウントするにはどうすればよいですか?LEFT JOINでMySQLを使用するにはどうすればよいですか?

私は

写真

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

... 2つのテーブルを持って、私はLEFT JOINを考えて、時には定格表には写真のための評価を持っていない必要があるが、私はまた、COUNT文を持っています(picidが写真のIDを持つ外部キーです)

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

彼を愛しますユーザは自分のIPで1つの画像のみを評価することができる。

最高の評価の順に2つの表を結合したいと考えています。新しいテーブル

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

を組み合わせ

(BMWが最も高く評価される)

私のMySQLのコード:

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

私のPHPコード:(UPDATED、コメントを追加しました - 実施例。 ..)

$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

+0

@TheBlackBenzKidしてください** **あなたの答えを質問に追加しないでください....新しい回答を作成してコメントで参照するか、まったくしないでください... – Neal

答えて

4

MySQLはあなただけid列によってグループにできます結合のサブクエリに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'^_^ingenious :-P – Neal

+0

2番目のクエリは私にとってより速く働いた。最後の括弧の後にDESCを追加したので、最高から最低まで注文することができました。ありがとう。唯一の問題はPHPの変換がありません – TheBlackBenzKid

+0

上記のPHPコードを追加しました。私に見せてもらえますか? – TheBlackBenzKid

2

あなたはサブクエリを使用する必要があります言われて、私は、MySQLはgroup byで本当に悪いです知っていることを

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

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

+0

@TheBlackBenzKid、それを感謝します... SQLを書く年から、非常に多くの人々がこのようなぼやけを持っているので、それに追随するのが難しくなります...プライマリ "select、from、where、group by、order by、すべてのフィールドおよび/または基準を容易に識別できるように1つのレベルにあります。 – DRapp

0

私はあなただけのデータを結合し、あなたの選択で、カウント(*)を行う必要があると考えています。あいまいな列に使用する表を指定してください。また、カウント(*)するときには、関数ごとにグループを使用することを忘れないでください。ここでは、私は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 

がんばろう。

関連する問題