【问题标题】:Order by votes - PHP按票排序 - PHP
【发布时间】:2012-09-14 08:14:12
【问题描述】:

我有一个投票脚本,可以得出每个用户的投票数。

一切正常,除了我现在需要按票数顺序显示每个用户的票数。请看我的数据库结构:

参赛作品:

UserID, FirstName, LastName, EmailAddress, TelephoneNumber, Image, Status

投票:

item, vote, nvotes

item 字段包含vt_img,然后是UserID,例如:vt_img4,并且 vote 和 nvotes 都显示投票数。

有什么想法可以将它们联系在一起并按投票最多的顺序显示用户吗?

谢谢

【问题讨论】:

  • 投票表中的每个用户是否只有一个条目?
  • Matteo Tassinari 和fluffeh 都有很好的答案,我同意fluffeh,你应该重新设计你的数据库结构,但是如果那不可能,那么Matteo 解决方案应该可以工作。
  • 我根据OP的实际数据库结构构建了自己的解决方案,但我真的认为他可能想要重组他的数据库。有人对我的回答投了反对票,但也没有解释原因......

标签: php mysql sql database voting


【解决方案1】:

您确实需要更改投票表的结构,以便进行正常连接。我强烈建议添加一个纯用户 ID 列,或者至少不要将其作为其他两个列的连接。然后,您可以根据 ID 轻松执行以下操作:

select
    a.userID,
    a.firstName,
    b.votes
from
    entries a
        join voting b
            on a.userID=b.userID
order by
    b.votes desc

另一种选择是考虑(如果它是一对一的关系)简单地将数据合并到一个表中,这样会更容易。

目前,这确实是一个XY 问题,您正在寻找一种方法来连接两个不打算连接的表。虽然有(可怕、可怕、可怕)的方法,但我认为最好的解决方案是做一些额外的工作并改变你的数据库(我们当然可以帮助你,这样你就不会丢失任何数据),然后您将能够(轻松地)现在(轻松地)做您想做的事情,并且您将来想做的所有其他事情(您现在不知道)将会非常多更容易。

编辑:这似乎是使用触发器为您插入新行的绝佳机会。 MySQL 触发器是数据库在某个预定义操作发生时将执行的操作。在这种情况下,您希望在将行插入主表时将新行插入表中。美妙之处在于您可以使用对原始表中数据的引用来做到这一点:

CREATE TRIGGER Entries_Trigger AFTER insert ON Entries
    FOR EACH ROW BEGIN
        insert into Voting values(new.UserID,0,0);
    END;

这将以下列方式工作 - 当一行插入到您的 Entries 表中时,数据库将插入该行(创建 auto_increment ID 等)然后立即调用此触发器,然后 使用 新创建的要插入到第二个表中的 UserID(以及一些用于 votes 和 nvotes 的零)。

【讨论】:

  • 感谢您回复我,我添加了该查询但没有运气!我已经在投票表中添加了一个 EntryID(作为 INT 11),并且我已经手动输入了与当前相关的 ID!但这没有显示,有什么想法吗?另外,我有正在输入数据的表格,我认为我需要修改,对吗?
  • 没关系,我在查询中略有不同,这是不同的。现在正在工作。我现在将发布我的插入代码,看看是否需要更改以更新投票表。
  • @craigclicky 在我浏览完之前,请离开并更改您的数据库密码。现在。您刚刚公开发布了您的用户名/密码以及您的数据库所在的 IP。
  • @craigclicky 好的,看看代码,如果你只修改了 votes 表来包含一个 userID 列,你不需要改变任何东西 - 它不会与 Votes 交互表。您可能需要查看将记录插入投票表/更新它们的代码。
  • 您好 Fluffeh,感谢您对密码的提醒,我忘记了包含...哎呀!这些现在已经改变了。
【解决方案2】:

您的数据库设计不当。应该是:

Voting:

item, user_id, vote, nvotes

将项目 id 和用户 id 与带有分隔符的连接字符串放在同一列中只是自找麻烦。这根本不可扩展。在Normalization 上查找基础知识。

【讨论】:

    【解决方案3】:

    你可以试试这个:

    SELECT *
    FROM Entries e
    JOIN Voting v ON (CONCAT('vt_img', e.UserID) = v.item)
    ORDER BY nvotes DESC
    

    但请注意,由于Entries 表的连接字段是在查询时构建的,因此此查询可能会很慢。

    您应该考虑更改您的数据库结构,以便 Voting 包含一个 UserID 字段以便进行直接连接。

    【讨论】:

      【解决方案4】:

      我想Entries 表是投票的地方(你的数据库模式对我来说没有多大意义,似乎你可以做得更好一点)。如果投票实际上是在Votes 表上并且连接到用户,那么您应该在该表中也有UserID 字段。不管怎样,这个例子都会有所帮助。

      假设您将UserID 添加到Votes 表中,这是存储用户投票的地方,而不是您的查询

      SELECT Users.id, Votes.*,
      SUM(Votes.nvotes) AS user_votes
      FROM Users, Votes
      WHERE Users.id = Votes.UserID
      GROUP BY Votes.UserID
      ORDER BY user_votes
      

      【讨论】:

        【解决方案5】:

        在您的查询中使用 ORDER BY --

        SELECT column_name(s)
        FROM table_name
        ORDER BY column_name(s) ASC|DESC
        

        【讨论】:

        • 当表格中的数据不匹配时,这无济于事——这是问题的症结所在。
        猜你喜欢
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 2014-08-16
        • 1970-01-01
        相关资源
        最近更新 更多