2012-02-26 16 views
0

これは私が抱えている問題の例です。クエリは子の行の評価が最も高いので、行paulrickを返す必要があります。代わりに、クエリはdaveowenを返しています。私の推測は、最初の子行であるためです。私はpositionでグルーピングしており、MAX(child.rating)を使用していますが、クエリがうまくいかないように機能していません。実際のテーブルでは、なぜ私はchild.*をselect句に使用するのかの列がたくさんあります。Mysql JOINクエリMAX値

mytableは

id | name | parentid| position| rating | 
    1 | mike | 1 | 1  | 6 | 
    2 | dave | 1 | 2  | 5 | 
    3 | paul | 1 | 2  | 7 | 
    4 | john | 1 | 2  | 3 | 
    5 | mike | 5 | 1  | 8 | 
    6 | owen | 5 | 2  | 2 | 
    7 | rick | 5 | 2  | 9 | 
    8 | jaye | 5 | 2  | 3 | 



$getquery = mysql_query("SELECT MAX(child.rating),child.* FROM mytable child 
     LEFT JOIN mytable parent on parent.parentid=child.parentid 
     WHERE parent.name LIKE '%mike%' GROUP BY child.position,child.parentid"); 



while($row=mysql_fetch_assoc($getquery)) { 

$id = $row['id']; 
$name = $row['name']; 
$parentid = $row['parentid']; 



if($id==$parentid) { 
    continue; 
    } 
echo "<p>Name: $name </p>"; 

} 

答えて

1

おかしい事は、私はちょうどあなたが探しているものを実現してきました。ここでは、最終的なクエリは次のとおりです。

select t1.* from mytable t1 
left join mytable t2 
on t1.parentid = t2.parentid and t1.rating < t2.rating 
join mytable parents 
on parents.id = t1.parentid 
where t2.rating is null and parents.name like '%mike%' 

そして、ここではworking example

0

追加:

ORDER BY child.rating DESC 
+0

私はまだdaveとowenを戻していました – user892134

+0

なぜあなたはグループごとに行動していますか?それなしで動作する必要がありますか評価でグループ化しようとします – Mukesh

0

ですこれは作品によって通行のMySQLの基であり、実際には正常に動作しています。

私はあなたのデータを理解していた場合(2つのがあり、それを回避する方法、のいずれかのサブクエリがあるか、それが一番上の子を取得合流し、あなたはおそらく、あなたのテーブルが

ある方法の順序を変更したい。ここに参加する方法があります

SELECT child.* 
FROM mytable parent 
LEFT JOIN mytable child ON parent.parentid=child.parentid 
LEFT JOIN mytable child2 ON child.parentid=child2.parentid AND child2.rating > child.rating AND child2.parentid IS NULL 
WHERE parent.name LIKE '%mike%' AND parent.position = 1 AND child.position <> 1 

これは、常に1の位置を持ち、子供はそうでないことを前提としています。また、親の評価が子どもより高い可能性を排除するために、child2の結合にもう1つのビットを追加する必要がありますか?

2回目の参加は、各親の評価が高い他の子がないことを確認します。

あなたはそれぞれの親の最大定格で何句から最初の数字にしてサブクエリを使用し、その評価に子供を得ることができます
3

select * 
from mytable c 
join 
    (select parentid, max(rating) as 'maxrating' 
    from mytable m 
    group by parentid) as q on c.parentid=q.parentid and c.rating = q.maxrating; 
+0

からのサブクエリは、正確に必要です – Tahbaza

+0

実際には、それは '必要' –

0

これは、あなたが何をしようとしてでなければなりません(私はわからないんですが、if'reは本当に親ののParentIDと子供ののParentIDを比較):

SELECT child.* FROM mytable child 
    INNER JOIN mytable parent on parent.parentid=child.parentid 
    LEFT JOIN mytable child2 ON (child2.parentid = parent.parentid AND child2.position = child.position AND child2.rating > child.rating) 
    WHERE parent.name LIKE '%mike%' AND child2.parentid IS NULL 
    GROUP BY child.position, child.parentid 
    HAVING `better` = 0; 

別のオプションは、サブクエリを使用することですが、あなたはより高速に動作している確認する必要があります:

SELECT child.* 
FROM (
    SELECT MAX(child.rating) maxrating, child.parentid, child.position FROM mytable child 
     INNER JOIN mytable parent on parent.parentid=child.parentid 
     WHERE parent.name LIKE '%mike%' 
     GROUP BY child.position,child.parentid 
) h 
    INNER JOIN mytable child ON (child.parentid = h.parentid AND child.position = h.position AND child.rating = h.maxrating) 

異なるサイズの表では、パフォーマンスが大きく異なる場合があります。

私はあなたのポイントが正しくない場合でも、何も参加しない何も必要ない場合は、OUTERの代わりにINNER JOINを使用することをお勧めします。 INNER JOINは通常より速いです。

実際には、大きなテーブルで2番目のものがより速く動作すると思います。