2011-01-22 1 views
0

je suis en train d'écrire une instruction SQL qui sélectionnera les éléments d'une table et l'ordre par le résultat de l'autre table ..J'ai besoin d'aide pour rédiger une déclaration complexe SELECT

les 2 tables sont:

événements: id, nom

présents: utilisateur , événement

Ive a obtenu cette stat estion:

SELECT * 
FROM `attendance` 
WHERE event='1' 
    AND user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153) 

J'utilise ceci pour obtenir le nombre d'amis que venir numéro d'événement 1.

maintenant je veux combiner cette déclaration avec un autre pour créer une déclaration que sélectionner tous les événements , et l'ordre par le nombre d'amis qui vont ... comment puis-je écrire cette déclaration?

Merci beaucoup, Amir.

Répondre

3

Je voudrais essayer quelque chose comme ceci:

SELECT 
    id, 
    name, 
    (SELECT COUNT(*) FROM attendance att WHERE att.event = ev.id) AS attending 
FROM 
    event ev 
ORDER BY 
    attending DESC 

Cependant, bien que je voudrais essayer quelque chose comme ça, fait est que je ai pas, donc cela ne fonctionne pas comme il est.

1

Vous pouvez également utiliser une jointure comme:

SELECT events.id, COUNT(attendance.user) AS attending 
FROM attendance INNER JOIN events ON attendance.event = events.id 
WHERE (attendance.user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153)) 
GROUP BY events.id 
ORDER BY attending DESC 
+0

Fonctionnement parfait .. merci! – Amir

0

En supposant que la liste des numéros est l'ensemble des amis que vous êtes intéressé par (il serait préférable de les stocker dans une table - voilà comment vous informations d'enregistrement dans une base de données), puis:

SELECT e.id, e.name, COUNT(*) AS friends 
    FROM attendance AS a 
    JOIN event  AS e ON a.event = e.id 
WHERE a.user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153) 
GROUP BY e.id, e.name; 

complexité, bien sûr, est dans l'œil du spectateur - ce n'est pas réellement complexe. Notez que tel qu'il est écrit, il ne répertorie pas les événements auxquels aucun des amis n'a accès. Si vous voulez, vous avez besoin d'un LEFT OUTER JOIN et vous avez besoin du « filtre ami » plus tôt que la principale clause WHERE:

SELECT e.id, e.name, COUNT(user) AS friends 
    FROM event AS e 
    LEFT OUTER JOIN 
     (SELECT user, event 
      FROM attendance 
     WHERE user IN (1,2,3,4,5,6,7,8,9,10,11,12,13,444,153) 
     ) AS a 
    ON a.event = e.id 
GROUP BY e.id, e.name; 

Le COUNT (utilisateur) rendements globaux zéro si toutes les lignes d'un groupe contiennent NULL dans la colonne de l'utilisateur.

SQL non testé.

+0

Travaillant également très bien, mais je ne suis pas sûr de l'efficacité dont j'ai besoin pour remplir la table afin de le tester ... merci! – Amir

+1

@Amir: rappelez-vous que la rectitude compte en premier; Ce n'est que lorsque quelque chose est correct que l'efficacité entre en jeu. En outre, si l'ensemble d'amis était dans une table, vous auriez une troisième jointure, et vous pourriez trouver que l'optimiseur fonctionne mieux avec la table qu'avec l'IN. Augmentez le nombre d'amis de 15 à 75, et vous pourriez bien trouver que la table surpasse l'IN. (Il y a environ 90 ans - J'ai dû écrire un générateur de requêtes adaptatif car pour les petits ensembles de valeurs dans la clause IN, la notation IN était la meilleure, mais pour les grands ensembles, il était préférable de stocker l'ensemble dans une table et rejoignez-le!) –

+0

Eh bien pouvez-vous me dire comment faire avec table temporaire et le rejoindre? parce que je n'ai trouvé que la méthode IN pour faire ça ...merci – Amir