2012-02-26 105 views
0

這是我遇到的問題的示例。該查詢應返回行paulrick,因爲它們對子行具有最高的評級。相反,查詢返回daveowen,我的猜測是因爲它們是第一個子行。我正在分組position和使用MAX(child.rating),但查詢不像我想要的那樣工作。在真正的表中,我有很多列,這就是爲什麼我在select子句中使用child.*Mysql JOIN查詢最大值

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

我做了它仍然是返回戴夫和歐文 – user892134 2012-02-26 12:25:45

+0

你爲什麼按位分組?它應該沒有這個工作,或嘗試按評級分組 – Mukesh 2012-02-26 12:43:52

0

這是作品的MySQL的方式組,實際上是正常工作。

有它周圍兩路,要麼一個子查詢或加入該得到的最頂端的孩子,你可能要重新排序表是

的方式這裏的連接方法(如果我理解您的數據正確):

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 

這使得假設,parants總是有位置1,而孩子沒有。您可能還需要在child2加入另外一點以消除家長比孩子有更高評分的可能性?

第二次加入確保沒有其他孩子對每位家長的評分較高。

3

您可以使用子查詢from子句先弄清楚什麼是最大額定值爲每個父,然後與評價得到孩子:

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 2012-02-26 13:02:28

+0

實際上,它不是'需要' – 2012-02-26 13:03:42

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) 

不同大小的表格可能會有很大差異。

如果我沒有明白你的觀點,我仍然建議你使用INNER JOIN而不是OUTER,如果你不需要任何東西來加入。 INNER JOINs通常會更快。

我其實認爲第二個會在更大的桌子上工作得更快。