2009-08-13 2 views
1

J'ai une requête (pour mes capacités) assez complexe que j'essaie d'améliorer. J'utilise la même requête plusieurs fois, en changeant seulement certains paramètres, donc j'espère ne pas avoir besoin d'une ré-écriture complète.groupe avec limite et j'espère pas de jeux vides

Je cherche un tas d'événements par date et lieu. Je les mets dans une table html où

 
Date 1   Date2  Date3 
event1/1   event1/2  event1/3 
event1/2   event2/2  event1/3 
event1/3   event2/3  event3/3 

Espérons que cela vous donne une idée de la sortie et du regroupement.

En ce moment je commets 3 requêtes, une pour chaque jour, et je passe dans le champ date. Ce que j'espère être en mesure de faire est de deux choses 1) fournir une période de sorte que je fais une seule requête 2) si un groupe de résultats est vide (donc rien sur date3), la réponse retournera date4

Voici ce que j'ai pour l'instant, mais il n'atteint pas l'objectif 2 (groupes vides), et il ne semble pas retourner le bon nombre dans la plage de dates, puisque je limite le nombre de résultats (même si sans la limite, je ne suis pas d'obtenir le résultat

J'ai simplifié la requête un peu afin qu'il soit plus facile à comprendre, espérons, mais la structure est exactement la même

 

SELECT event.stuff, user.stuff, eventdate.stuffshows , 
    GROUP_CONCAT(user.groupstuff) AS myStuff 
FROM events 
JOIN users ON events.id = users.bid 
WHERE location= location 
AND event.date 
BETWEEN '2009-08-14' 
AND '2009-08-17' 
GROUP BY event.date 
ORDER BY event.date, user.id DESC 
LIMIT 0 , 5 
) mystuff ON event.bid = similar.id 
AND event.date=similar.date 

Donc ce que je suis à la recherche est essentiellement ce genre de out (similaire à ce que j'ai ci-dessus)

 
date1/event1 
date1/event2 
date1/event3 
date1/event4 
date1/event5 
date2 - empty - nothing returned, go to date3 
date3/event1 
date3 /event2 
date3/event3 
date4/event1 
date4/event2 
date5 - empty - nothing returned, go to date6 
date6/event1 

J'espère que cela est clair, et qu'il est possible.

+0

Désolé, je ne peux pas comprendre ce que vous devez obtenir où vous voulez. J'ai l'impression que votre table "événements" n'a pas trois colonnes, "Date 1", "Date 2" et "Date 3". Peut-être donner un échantillon de la table que vous avez qui devrait produire la sortie que vous voulez. Il n'y a pas de "date5" ou "event4" dans la table pour fournir ces valeurs dans la sortie. – Degan

+0

Désolé degan, la 'table' est une table de sortie (html), pas une table de base de données. La requête est exécutée sur 3 tables, événements, utilisateurs et similaires. – pedalpete

+0

Avez-vous essayé la proposition 'HAVING'? – searlea

Répondre

1

Vous pourriez être en mesure de le faire avec un HAVING dans la sous-requête:

GROUP BY event.date 
ORDER BY event.date, user.id DESC 
HAVING event.stuff 
LIMIT 0 , 5
+0

Désolé, je n'ai pas répondu à cela plus tôt. Le 'avoir', je crois, résout le problème d'avoir un ensemble vide, mais ce n'est pas vraiment un problème à moins que je puisse faire fonctionner le groupe entre, ce que je ne crois pas possible sans plusieurs requêtes. Ce que je me retrouve avec n'est pas 5 résultats pour chaque date, mais 5 résultats pour la première date. Afin de faire tout cela avec une requête, je devrais obtenir 5 résultats pour chaque date. – pedalpete

Questions connexes