SQL,使语句缩短的方法?

时间:2015-05-09 23:53:05

标签: mysql sql

我是一名新的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

3 个答案:

答案 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

根据需要添加更多类型。

http://sqlfiddle.com/#!2/d6d7b/4