MySql - выбрать две таблицы с разным лимитом - PullRequest
1 голос
/ 19 ноября 2011

У меня есть две таблицы, подобные этой:

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 с одинаковым именем в двух таблицах ...

То, что я хочу в результате запроса, это:

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>';
}

Я хочу изменить этот код на один запрос вместо двух запросов ..

Как я могу это сделать?

Ответы [ 5 ]

2 голосов
/ 19 ноября 2011
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
1 голос
/ 19 ноября 2011
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 голосов
/ 19 ноября 2011
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
0 голосов
/ 19 ноября 2011

Во-первых, я бы рекомендовал не использовать строки для связи таблиц, а использовать их идентификаторы, поэтому:

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 голосов
/ 19 ноября 2011

Это базовый 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 Выберите только строки с максимальным значением для столбца

...