2011-01-19 8 views
2

У меня есть большая проблема с тем, чтобы это нормально работало. Вот сделка.mysql со многими таблицами

У меня есть 4 таблицы - timeline, connections, images, votes

Timeline стол:

time_id 
time_title 

т.д.

В таблице график соединяется с таблицей изображений с помощью таблицы соединений

Connections стол:

time_id 
image_id 

Так соединения содержат информацию о ид "пост" на временной шкале и о ид изображения

Изображения стол:

image_id 
image_url 
image_type 

Изображения таблица содержит изображения, которые можно использовать на одной и той же временной шкале (пост), поэтому я вижу соединение, просматривая таблицу соединений.

У меня также есть таблица голосов, который содержит информацию о голосовавших за конкретные сроки поста

Голоса таблица:

vote_id 
time_id 

таблица голосов содержит большое количество строк каждой TIME_ID и идея заключается в посчитайте количество раз, чтобы они были самыми популярными

Так вот вопрос: Мне нужно получить 5 самых проголосовавших time_titles и показать их с едой т изображение для каждого time_title (пост), так что выглядят как это, например

  • Изображение 1, что соответствует Заголовок 1 - то есть наибольшее количество голосов
  • Изображение 2, что соответствует Заголовок 2 - то есть второй набравших наибольшее количество голосов

т.д.

каждой временной шкалы ряда (пост) может содержать много изображений, и я только хочу показать первый из каждого поста.

Надеюсь, вы поймете мою проблему!

Большое спасибо!

+2

Это не IM, вы не должны положить каждое предложение в отдельной строке ... – BoltClock

ответ

2

Запрос будет

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; 

Это будет работать, но не может быть самый оптимизированный один.

- EDIT , чтобы получить image_type попробовать

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

Спасибо, миллион раз! Он отлично работает! Могу ли я добавить еще один вопрос ... :) В моей таблице изображений у меня есть столбец типа, который показывает тип изображения, как бы добавить это утверждение i, чтобы я мог получить эту информацию для сортировки? В очередной раз благодарим за помощь!! – Tobias

+0

hey tobias, я добавил условие тоже .. и покажу свою оценку голосованием и выбрав правильный ответ (если это правильно, то есть). это касается не только этого вопроса, но и всех ваших вопросов. –

+0

Еще раз спасибо! его работа как шарм с редактированием тоже! спасибо много, relily !! – 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 = т. id' images table не имеет 'time_id', его в таблице соединений. –

+0

@ Ануш: ты прав, исправлен. – Quassnoi