有许多表的mysql

时间:2011-01-19 11:32:10

标签: php sql mysql

我遇到一个主要问题,让它正常工作。这是交易。

我有4个表 - timelineconnectionsimagesvotes

时间表:

time_id
time_title

时间轴表通过连接表

与images表连接

连接表:

time_id
image_id

因此,连接保存有关“发布”时间轴和图像ID

的ID的信息

图片表:

image_id
image_url
image_type

图像表包含可以在同一时间轴(帖子)中使用的图像,因此我可以通过查看连接表来查看连接。

我还有一张投票表,其中包含有关特定时间表帖子的投票信息

投票表:

vote_id
time_id

投票表包含每个time_id的很多行,并且想法是计算最受欢迎的次数

所以继承人的问题: 我需要得到5个最多投票的time_titles并用每个time_title(post)的第一张图片显示它们,以便它看起来像这样的例子

  • 与标题1对应的图像1 - 即投票最高的
  • 与标题2对应的图像2 - 投票次数最高

每个时间轴行(帖子)可以容纳许多图像,我只想显示每个帖子的第一个。

希望你理解我的问题!

非常感谢!

2 个答案:

答案 0 :(得分: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;

这可行,但可能不是最优化的。

- 编辑 获取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;

答案 1 :(得分: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
        )