[英]How to make this query run faster?
我有這樣的查詢:
SELECT
`om_chapter`.`manganame` as `link`,
(SELECT `manganame` FROM `om_manga` WHERE `Active` = '1' AND `om_manga`.`link` = `om_chapter`.`manganame` LIMIT 0,1) AS `manganame`,
(SELECT `cover` FROM `om_manga` WHERE `Active` = '1' AND `om_manga`.`link` = `om_chapter`.`manganame` LIMIT 0,1) AS `cover`,
(SELECT `othername` FROM `om_manga` WHERE `Active` = '1' AND `om_manga`.`link` = `om_chapter`.`manganame` LIMIT 0,1) AS `othername`
FROM `om_chapter`
WHERE
`Active` = '1' AND
(SELECT `Active` From `om_manga` WHERE `om_manga`.`link` = `om_chapter`.`manganame` LIMIT 0,1) AND
`id` IN ( SELECT MAX(`id`) FROM `om_chapter` WHERE `Active` = '1' GROUP BY `manganame` )
ORDER BY `id` DESC LIMIT 10
那么如何才能更快地進行此查詢?
這是我的表格:
om_chapter:
id | manganame | chapter | Active
-----------------------------------------
1 | naruto | 1 | 1
2 | naruto | 12 | 1
3 | naruto | 22 | 1
4 | bleach | 10 | 1
5 | bleach | 15 | 1
6 | gents | 1 | 1
7 | naruto | 21 | 1
om_manga:
id | othername | manganame | cover | Active
-----------------------------------------------------
1 | naruto | naruto | n.jpg | 1
2 | bleach | bleach | b.jpg | 1
4 | gents | gents | g.jpg | 1
我想要形成這個查詢的第一件事就是通過對manganame進行分組並按id排序,從om_chapter給出10個最后一行。我嘗試使用一個簡單的查詢,使用組甚至是不同的但是沒有一個給我正確的結果......
在具有group或distinct的簡單查詢中,結果如下所示:
id | manganame | chapter | Active
-----------------------------------------
7 | prince | 21 | 1
5 | gent | 15 | 1
2 | naruto | 12 | 1
1 | bleach | 1 | 1
但我想要這個結果:
id | manganame | chapter | Active
-----------------------------------------
9 | gents | 21 | 1
8 | bleach | 21 | 1
7 | prince | 21 | 1
6 | naruto | 1 | 1
所以我用這個:
WHERE
`Active` = '1' AND
(SELECT `Active` From `om_manga` WHERE `om_manga`.`link` = `om_chapter`.`manganame` LIMIT 0,1) AND
`id` IN ( SELECT MAX(`id`) FROM `om_chapter` WHERE `Active` = '1' GROUP BY `manganame` )
我使用sub select in where因為我希望om_manga表中的Active字段為1 ..
對於子選擇的重置,我實際上沒有嘗試加入,但我會...!
我可能誤解了你的意圖..但這是一次嘗試:
SELECT c.`manganame` AS `link`
, m.`manganame`
, m.`cover`
, m.`othername`
FROM
`om_manga` m
INNER JOIN `om_chapter` c
ON m.`link` = c.`manganame`
INNER JOIN
( SELECT `manganame`, MAX(`id`) AS `maxid`
FROM `om_chapter`
WHERE `Active` = '1'
GROUP BY `manganame` ) mx
ON mx.`maxid` = c.`id`
ORDER BY c.`id` DESC LIMIT 10
我將向om_chapter表引入一個外鍵contstrain,以說明從漫畫到其相應章節的鏈接。
這就是我將問題概念化的方式。
A manga can have many chapters. A chapter belongs to one manga.
然后我會改變om_chapter表,包括鏈接到漫畫的章節的外鍵。
ALTER TABLE om_Chapter (
ADD mangaID int references om_Manga (id)
)
並刪除manganame列,因為它現在是多余的
ALTER TABLE om_Chapter (
DROP COLUMN manganame
)
那么你的表格看起來就像這樣。
om_manga:
id | othername | manganame | cover | Active
-----------------------------------------------------
1 | naruto | naruto | n.jpg | 1
2 | bleach | bleach | b.jpg | 1
4 | gents | gents | g.jpg | 1
om_chapter:
id | chapter | Active | mangaID
-----------------------------------------
1 | 1 | 1 | 1
2 | 12 | 1 | 1
3 | 22 | 1 | 1
4 | 10 | 1 | 2
5 | 15 | 1 | 2
6 | 1 | 1 | 4
最后你可以像這樣查詢表格
SELECT TOP 10 m.Manganame as link,
m.Manganame,
m.cover,
m.othername,
FROM om_manga as m INNER JOIN
om_chapter as c ON m.ID = c.mangaID
WHERE m.active = 1 AND c.active = 1
ORDER BY m.ID DESC
為什么不簡單加入?
SELECT om_chapter.manganame, cover, othername
FROM om_chapter
JOIN om_manga ON om_chapter.manganame = om_manga=manganame
WHERE om_chapter.Active = 1 AND om_manga.Active = 1
除非我誤讀你的版本。
使用左外連接(並丟失子查詢和后引號):
SELECT c.manganame AS link,
m.manganame AS manganame,
m.cover AS cover,
m.othername AS `othername
FROM om_chapter AS c
LEFT JOIN om_manga AS m
ON c.manganame = m.manganame
WHERE c.Active = '1'
AND c.id IN (SELECT MAX(o.id)
FROM om_chapter AS o
WHERE o.active = 1
GROUP BY o.manganame)
ORDER BY c.id DESC LIMIT 10
如果是我的查詢,我可能也選擇' c.id AS id
'。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.