2011-01-19 5 views
2

J'ai un gros problème pour que cela fonctionne correctement. Voici l'affaire.mysql avec plusieurs tables

J'ai 4 tables - timeline, connections, images, votes

table Timeline:

time_id 
time_title 

etc.

Le tableau chronologique se connecte à la table d'images via la table des connexions

table Connexions:

time_id 
image_id 

Ainsi, les connexions contiennent des informations sur l'identification du "post" la chronologie et sur ID d'image

Table Images:

image_id 
image_url 
image_type 

table Images contient images qui pourraient être utilisées dans la même chronologie (post), de sorte que je peux voir la connexion en regardant la table de connexion.

J'ai aussi une table de votes qui contient des informations sur les votes pour le poste de calendrier précis

table Votes:

vote_id 
time_id 

la table votes contient plusieurs lignes de chaque TIME_ID et l'idée est de compter le nombre de fois où se trouve le plus populaire

Alors voici la question: Je dois obtenir les 5 titres les plus votés et les montrer avec les sapins t l'image pour chaque time_title (post) afin qu'il ressemble à ceci par exemple

  • Image 1 qui correspond au titre 1 - qui est le plus voté
  • Image 2 qui correspond au Titre 2 - qui est la deuxième le plus voté

etc.

chaque ligne chronologique (post) peut contenir de nombreuses images et je veux seulement montrer le premier de chaque poste.

J'espère que vous comprenez mon problème!

Merci beaucoup!

+2

Ce n'est pas IM, vous ne devez pas mettre chaque phrase dans sa propre ligne ... – BoltClock

Répondre

2

La requête sera

SELECT 
count(v.vote_id) as vote_times 
t.time_title, 
( 
    SELECT 
    image_url 
    FROM 
    images 
    WHERE 
    image_id = (
     SELECT 
     image_id 
     FROM 
     connections as c 
     WHERE 
     c.time_id = t.time_id 
     LIMIT 1 
    ) 
    LIMIT 1 
) as image_url 
FROM 
votes as v 
    LEFT JOIN 
    time as t 
    on 
    t.time_id = v.time_id 
GROUP BY 
v.time_id 
ORDER BY 
vote_times desc 
LIMIT 5; 

Cela fonctionne, mais peut-être pas le plus optimisé.

- EDIT pour obtenir image_type aussi essayer

SELECT 
    count(v.vote_id) as vote_times 
    t.time_title, 
i.image_url, 
i.image_type 

FROM 
    votes as v 
     LEFT JOIN 
      time as t 
       on 
        t.time_id = v.time_id 
    LEFT JOIN 
    images as i 
    on 
    i.image_id = (
     SELECT 
      image_id 
     FROM 
      connections as c 
     WHERE 
      c.time_id = t.time_id 
     LIMIT 1 
     ) 
GROUP BY 
    v.time_id 
ORDER BY 
    vote_times desc, image_type desc 
LIMIT 5; 
+0

Merci mille fois! C'est super! Puis-je ajouter une autre question ... :) Dans mon tableau d'image j'ai une colonne de type qui montre le type d'image comment ajouterais-je l'instruction afin que je puisse atteindre cette information pour le tri? Merci encore pour votre aide!! – Tobias

+0

hey tobias, j'ai ajouté la condition aussi .. et montrez votre appréciation en votant et en sélectionnant comme réponse correcte (si elle est correcte c'est). ce n'est pas seulement pour cette question, mais pour toutes vos questions. –

+0

Encore une fois merci beaucoup! son fonctionnement comme un charme avec le montage aussi! merci beaucoup, relly !! – Tobias

1
SELECT t.time_title, i.* 
FROM (
     SELECT t.time_title 
     FROM timeline t 
     LEFT JOIN 
       votes v 
     ON  v.time_id = t.time_id 
     GROUP BY 
       t.id 
     ORDER BY 
       COUNT(vote_id) DESC, t.time_id DESC 
     LIMIT 5 
     ) t 
JOIN images i 
ON  i.id = 
     (
     SELECT ii.image_id 
     FROM connections c 
     JOIN image ii 
     ON  ii.image_id = c.image_id 
     WHERE c.time_id = t.time_id 
     ORDER BY 
       ii.id DESC -- or whatever order you define for the "first" image 
     LIMIT 1 
     ) 
+0

'WHERE ii.time_id = t. La table d'images d'id' n'a pas 'time_id', c'est dans la table de connexion. –

+0

@Anush: vous avez raison, corrigé. – Quassnoi