2011-11-19 87 views
1

我有兩個表是這樣的:MySQL的 - 選擇具有不同的限制兩個表

om_manga:

id | link  | manganame  | viewed  
--------------------------------------------- 
1 | naruto | naruto  | 11215  
2 | bleach | bleach  | 32442  
3 | one piece | one_piece  | 11215  
4 | gents  | gents   | 4334  

om_chapter:

id | manganame  | chapter | volume 
----------------------------------------- 
1 | naruto  | 1   | 1 
2 | naruto  | 12  | 1 
3 | naruto  | 22  | 1 
4 | bleach  | 10  | 1 
5 | bleach  | 15  | 1 
6 | gents   | 1   | 1 

我要的是選擇,例如10通過查看的順序形成om_manga行,並在兩個表中選擇1個最後一行的形式om_chapter與相等的manganame ...

我想在查詢結果是這樣的:

id | manganame  | viewed | chapter | volume 
---------------------------------------------------- 
1 | naruto  | 14511  | 22  | 1 
2 | bleach  | 45151  | 15  | 1 

這是我的PHP代碼:

$query = mysql_query("SELECT `link`,`cover`,`manganame` FROM `om_manga` WHERE `Active`='1' ORDER BY `viewed` DESC LIMIT ".$options['number_of_popular_manga']); // 
while($row = mysql_fetch_array($query)){ 
    $rww = mysql_fetch_array(mysql_query("SELECT `chapter`,`volume`,`manganame` FROM `om_chapter` WHERE `manganame`='".sql_quote($row['link'])."' AND `Active`='1' ORDER BY `etime` DESC LIMIT 1")); // 
    if (isset($rww['chapter'])) $volchap = '<a href="read.php?manga='.$row['link'].'&amp;chap='.$rww['chapter'].'">Vol.'.$rww['volume'].' CH.'.$rww['chapter'].'</a>'; else $volchap = ''; 
    echo '<li class="index-right-ul-li"><img onerror="this.src=\'images/noimage.jpg\'" src="images/info/'.$row['cover'].'" width="30" height="33"/><div class="index-right-ul-div"><p class="index-right-ul-div-tital"><a href="manga.php?manga='.$row['link'].'">'.htmlspecialchars($row['manganame'], ENT_QUOTES).'</a></p><p class="index-right-ul-div-chapter">'.$volchap.'</p></div></li>'; 
} 

我想在一個查詢更改此代碼而不是兩個querys ..

如何我可以那樣做嗎?

+1

很好解釋。歡迎來到Stack Overflow。 – CodeMouse92

回答

2
SELECT id,viewed,manganame, 
    (SELECT chapter 
    FROM om_chapter 
    WHERE om_manga.manganame=om_chapter.manganame 
    ORDER BY chapter DESC 
    LIMIT 0,1) AS chapter, 
    (SELECT volume 
    FROM om_chapter 
    WHERE om_manga.manganame=om_chapter.manganame 
    ORDER BY chapter DESC 
    LIMIT 0,1) AS volume 
FROM om_manga 
ORDER BY viewed DESC 
LIMIT 0,10 
+0

謝謝......它的工作,即使沒有任何編輯。 – kamal

0

這是基本的SQL,它調整到你的PHP代碼:

select m.id, m.manganame, m.viewed, c.chapter, c.volume 
from om_manga m 
inner join om_chapter c on m.manganame = c.manganame 
inner join (
    select manganame, max(chapter) chapter 
    from om_chapter 
) ss on c.manganame = ss.manganame and c.chapter = ss.chapter 
order by m.viewed desc 
limit 10 

這是問題的變化。

進一步學習,有關於這個問題的一個非常全面的答案在這裏:SQL Select only rows with Max Value on a Column

+0

謝謝..我盡力保持:D – kamal

1
SELECT om.link, om.cover, om.manganame, max_chapter.* 
FROM om_manga om , 

(Select chapter, volume, manganame, Max(etime) 
from om_chapter 
group by chapter, volume, manganme) max_chapter 

WHERE om.Active='1' And om.manganame = max_chapter.manganame 
limit 10 

我沒有測試過的查詢,但它的一個想法,應該工作

+0

它完全可行..謝謝..! – kamal

0

首先,我會建議不使用字符串關聯表,但用戶自己的ID,所以:

om_manga: 
id | name | viewed 

om_chapter: 
id | id_manga | chapter | volume 

對於您的問題,使用結構結合表:

$query = "SELECT m.*, c.*, max(c.chapter) as last_chapter FROM om_manga m, om_chapter c WHERE m.manganame=c.manganame AND c.Active='1' ORDER BY c.etime DESC, m.viewed DESC LIMIT ".$options['number_of_popular_manga']); 

而且用我的結構:

$query = "SELECT m.*, c.*, max(c.chapter) as last_chapter FROM om_manga m, om_chapter c WHERE m.id=c.id_manga AND c.Active='1' ORDER BY c.etime DESC, m.viewed DESC LIMIT ".$options['number_of_popular_manga']); 
+0

-1建議有效,但答案確實得到OP的預期結果 –

+0

這是否更好? –

+0

感謝您的建議...但這是我如何建立我的分貝,所以我不能做任何關於它的事情! – kamal

0
select m.`link`,m.`cover`,m.`manganame`, latest_chapter.chapter, latest_chapter.volume 
from `om_manga` m 
join (select c.manganame, max(c.volume) volume from om_chapter c) 
       as latest_volume 
       on m.manganame = latest_volume.manganame 
join (select c.manganame, c.volume, max(c.chapter) chapter from om_chapter c) 
       as latest_chapter 
       on m.manganame = latest_chapter.manganame 
       and latest_chapter.volume = latest_volume.volume 
order by m.viewed desc 
limit 10 
相關問題