0

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

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

参赛作品:

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

表决:

item, vote, nvotes

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

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

谢谢

4

5 回答 5

2

您确实需要更改投票表的结构,以便可以进行正常连接。我强烈建议添加一个纯用户 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 插入第二个表(以及一些投票和 nvotes 的零)。

于 2012-09-14T08:19:09.490 回答
0

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

Voting:

item, user_id, vote, nvotes

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

于 2012-09-14T08:18:27.747 回答
0

你可以试试这个:

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

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

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

于 2012-09-14T08:18:49.393 回答
0

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

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

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
于 2012-09-14T08:28:56.330 回答
-1

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

SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC
于 2012-09-14T08:17:16.350 回答