我是一名新的IT学生,我有一些学校的例子。
这里我有一个SQL语句,因为它很长而且加载速度很慢。 这里有人知道如何让这个更小吗? 使用mysql
SELECT genre, titel, speelduur
FROM film
WHERE speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Actie')
AND genre = 'Actie'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Avontuur')
AND genre = 'Avontuur'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Comedie')
AND genre = 'Comedie'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Dans')
AND genre = 'Dans'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Drama')
AND genre = 'Drama'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Epos')
AND genre = 'Epos'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Fantasie')
AND genre = 'Fantasie'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Historisch')
AND genre = 'Historisch'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Horror')
AND genre = 'Misdaad'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Musical')
AND genre = 'Musical'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Mysterie')
AND genre = 'Mysterie'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Oorlog')
AND genre = 'Oorlog'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Rampen')
AND genre = 'Rampen'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Religieus')
AND genre = 'Religieus'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Romantiek')
AND genre = 'Romantiek'
OR speelduur =
(SELECT MAX(speelduur)
FROM film
WHERE genre ='Science Fiction')
AND genre = 'Science Fiction'
你看我的问题是对的吗?:P
答案 0 :(得分:0)
select f.genre,
f.title,
f.speeldur
from film f
join (
select genre,
max(speelduur) as max_speelduur_for_genre
from film
group by genre
) v
on f.genre = v.genre
and f.speeldur = v.max_speelduur_for_genre
答案 1 :(得分:0)
问:你似乎是我的问题,对吧?
答:是的,我们看到了问题。
作为缩短查询和提高性能的一种可能方法,我们可以使用内联视图查询返回列出类型的MAX(speeldur)
。该查询的结果实现了一个临时表,MySQL称之为“派生表”。外部查询然后在“派生表”和film
表之间执行JOIN操作,以从film
获取相关行。
我们注意到,根据原始查询,我们需要获取“{恐怖”类型的MAX(speeldur)
,然后将其与speelduur
匹配为具有“Misdaad”类型的行。 (有点好奇,需要完成,但我们可以在JOIN谓词中处理,没问题。)
如果意图是获得“全部”类型,我们可以从视图查询中省略谓词WHERE g.genre IN (list)
。然后我们将获得genre
返回的所有可能值。
作为这种方法的一个例子:
SELECT f.genre
, f.titel
, f.speelduur
FROM film f
JOIN ( SELECT g.genre
, MAX(g.speelduur) AS max_speelduur
FROM film g
WHERE g.genre IN ('Actie','Avontuur','Comedie','Dans','Drama'
,'Epos','Fantasie','Historisch','Horror'
,'Musical','Mysterie','Oorlog','Rampen'
,'Religieus','Romantiek','Science Fiction')
GROUP BY g.genre
) m
JOIN film f
ON f.genre = IF(m.genre='Horror','Misdaad',m.genre)
AND f.speelduur = m.max_speelduur
为了获得最佳性能,我们希望提供合适的索引。对于此查询,我们希望这足够了:
... ON film (genre, speelduur)
作为替代方案,我们可以改为定义这样的索引:
... ON film (genre, speelduur, film)
因为那将是外部查询的“覆盖索引”。
答案 2 :(得分:0)
这适用于MySql 5.5
SELECT MAX(speelduur), genre
FROM film
where genre in ('Actie','Comedie','Dans')
group by genre desc
根据需要添加更多类型。