按投票顺序 - PHP

时间:2012-09-14 08:14:13

标签: php mysql sql database voting

我有一个投票脚本,可以提取每位用户的投票数。

一切正常,但我现在需要按照投票次数显示每位用户的投票数。请参阅我的数据库结构:

条目:

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

投票:

item, vote, nvotes

项目字段包含vt_img,然后是UserID,例如:vt_img4,并且投票& nvotes显示投票数。

我是如何将这些内容联系在一起并按照最高投票顺序显示用户的任何想法?

由于

5 个答案:

答案 0 :(得分:2)

您确实需要更改投票表的结构,以便您可以进行正常连接。我强烈建议添加一个纯userID列,或者至少不要使它成为另外两列的连续。根据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问题,您正在寻找一种方法来连接两个不打算加入的表。虽然 (可怕,可怕,可怕)的方式,我认为最好的解决方案是做一些额外的工作并改变你的数据库(我们当然可以帮助你,所以你不要丢失任何数据)然后你就能够现在(轻松)做你想做的事情以及你将来想要做的所有其他事情(你现在都不知道)将是如此多更容易。

编辑:看起来这是一个很好的机会,可以使用Trigger为您插入新行。 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等)然后立即调用此触发器,然后使用< / em>新创建的UserID将插入到第二个表中(以及一些为投票和nvotes的零)。

答案 1 :(得分:0)

您的数据库设计糟糕。它应该是:

Voting:

item, user_id, vote, nvotes

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

答案 2 :(得分:0)

你可以试试这个:

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

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

您应该考虑更改数据库结构,以便Voting包含UserID字段,以便直接加入。

答案 3 :(得分:0)

我认为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

答案 4 :(得分:-1)

在您的查询中使用ORDER BY -

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