[résolu] film le plus loué SQL

film le plus loué SQL [résolu] - SQL/NoSQL - Programmation

Marsh Posté le 10-12-2006 à 02:31:09    

bonjour à tous!
 
j'ai quelques petits problèmes d'SQL...
 
dans une table de location de vidéo, contenant les champs suivants : no_client, no_location, no_film   , je n'ai aucune idée comment écrire une query qui retourne le film le plus loué...
 
j'ai essayer de la façon suivante :
 
SELECT MAX(COUNT(*))
FROM location
GROUP BY no_location;
 
et
 
SELECT COUNT(no_film) as cnt
FROM locations
WHERE cnt >= ALL (SELECT COUNT(no_film) FROM locations GROUP BY no_film)
GROUP BY no_film;
 
aidez-moi s'il vous plait!


Message édité par karminator98 le 12-12-2006 à 21:16:45
Reply

Marsh Posté le 10-12-2006 à 02:31:09   

Reply

Marsh Posté le 11-12-2006 à 12:49:04    

SELECT MAX(COUNT(*))
FROM location
GROUP BY no_film;
ne fonctionne pas?

Reply

Marsh Posté le 11-12-2006 à 13:07:26    

select no_film, count(*) from location group by no_film order by count(*) desc limit 1
 
A adapter en fonction de son sgbd ( particulièrement pour le limit)

Reply

Marsh Posté le 11-12-2006 à 14:26:45    

select MAX(cnt) from (select count(*), no_film from location group by no_film) as v1
 
semble + rapide

Reply

Marsh Posté le 11-12-2006 à 14:52:34    

polo021 a écrit :

select MAX(cnt) from (select count(*), no_film from location group by no_film) as v1

 

semble + rapide


 :pfff: nawak, ça peut pas être plus rapide vu que tu fais la même requête, que tu l'as met dans un table temporaire puis tu refais une requête dessus.
Et au passage tu perds l'information sur le film en question vu que tu ne remontes plus que "le plus grand nombre de fois où un film a été loué" sans savoir duquel il s'agit ....


Message édité par anapajari le 11-12-2006 à 14:52:53
Reply

Marsh Posté le 11-12-2006 à 15:33:20    

:pt1cable: ha ben oui tu as tout a fait raison.
pour la rapidité, ca me semblait bizarre aussi mais c'est ce que me retournait l'analyseur. [:sinclaire]

Reply

Marsh Posté le 11-12-2006 à 16:46:33    

SELECT no_film
FROM locations
GROUP bY no_film
HAVING COUNT(no_film) = (SELECT MAX(COUNT(no_film)) GROUP by no_film)

 

PS : Je ne garantie pas l'ordre des instructions.


Message édité par Kilyn le 11-12-2006 à 16:48:57

---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 12-12-2006 à 21:07:40    

finalement, merci de m'avoir aidé... la réponse est :
 
SELECT no_film
FROM locations
GROUP BY no_film
HAVING COUNT(no_film) >= ALL (SELECT COUNT(no_film) FROM locations GROUP BY no_film);
 
du moins, c'est celle qui marche dans MySQL

Reply

Marsh Posté le 13-12-2006 à 09:57:53    

nan mais faut arrêter la drogue les jeunes là....
C'est n'importe quoi la requete que tu viens d'écrire. La tu fais 2 scans sur ta table locations pour ... rien ...  
Donc je remets la "bonne requête" :

Code :
  1. select no_film, count(*) from location group by no_film order by count(*) desc limit 1


Et vous avez de la chance que MagicBuzz soit pas tombé sur ce poste o

Reply

Marsh Posté le 13-12-2006 à 12:16:16    

anapajari a écrit :

nan mais faut arrêter la drogue les jeunes là....
C'est n'importe quoi la requete que tu viens d'écrire. La tu fais 2 scans sur ta table locations pour ... rien ...
Donc je remets la "bonne requête" :


Et vous avez de la chance que MagicBuzz soit pas tombé sur ce poste o

 

Mouais le limit 1 connaît pas. C'est du normalisé ?


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 13-12-2006 à 12:16:16   

Reply

Marsh Posté le 13-12-2006 à 14:04:50    

Kilyn a écrit :

Mouais le limit 1 connaît pas. C'est du normalisé ?


Si j'en crois la doc de mySQL, oui : http://dev.mysql.com/doc/refman/4.1/en/select.html

Reply

Marsh Posté le 13-12-2006 à 14:11:42    

tiens on doit bosser sur la meme chose :d

Reply

Marsh Posté le 13-12-2006 à 14:18:22    

Kilyn a écrit :

Mouais le limit 1 connaît pas. C'est du normalisé ?


Du normalisé MySQL  [:airforceone]  


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 13-12-2006 à 14:36:28    

oui ça n'a rien de standard, selon les sgbd ça s'écrit différement...
Genre sous db2 c'est "first first 1 rows only", mais bon si tu relis bien mon premier post c'est ce qui était marqué hein :o

Reply

Marsh Posté le 13-12-2006 à 14:47:40    

anapajari a écrit :

oui ça n'a rien de standard, selon les sgbd ça s'écrit différement...
Genre sous db2 c'est "first first 1 rows only", mais bon si tu relis bien mon premier post c'est ce qui était marqué hein :o


J'ai juste lu ton truc sur la drogue, et je me suis dit que ce serait bien d'aider les jeunes, moi aussi.  [:airforceone]  


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 13-12-2006 à 14:59:09    

pour en revenir à tout ce borderl, si on ne dispose pas de "limit 1", "top 1" ou autre. genre on utilise Oracle et en chie pour utiliser rownum.
 
y'a une autre solution, toujours bêtement en reprenant calmement la problématique étape pas étape...
 
tous les films avec le nombre de locations :
 
select no_film, count(*)
from location
group by no_film
 
le plus grand nombre de locations :
 
select max(count(*)) from location group by no_film
 
maintenant, je veux le no_film où count() est le plus grand :
 
select no_film, cpt
from
(
select no_film, count(*) cpt
from location
group by no_film
)
where cpt = (select max(count(*)) from location group by no_film)


Message édité par MagicBuzz le 13-12-2006 à 14:59:39
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed