除非插件切换到以不同的方式存储投票,否则就不会有基于投票进行排序的好方法。
看看投票表中的一行。
+-------------------------------------------------------+
| ID | post | votes | guests | usersinks | guestsinks |
+-------------------------------------------------------+
| 1 | 1234 | ,1,2,3 | | | |
+-------------------------------------------------------+
所有用户的投票都存储在一个单列(投票)中,MySQL没有合适的方法根据该列进行拆分、计数和排序。
也许一些MySQL忍者可以创建一个过程/函数来实现这一点,但这超出了我的SQL专业知识。
不知道作者为什么选择这样存储投票,但从结果排序的角度来看,这是一个糟糕的DB设计决策(imo)。
我很感激我没有真正解决这个问题,但我想指出这一点可能很好,虽然理论上这可能很容易,但有一个很好的理由,作者没有为这个插件提供这个功能-他的db设计使得基于投票的排序非常困难(至少在SQL级别)。
如果我写这样一个插件,我会这么做。。
使用一个新表仅保留投票,所有投票。。
表中有一些虚构的数据。
Table: wp_post_votes
Type: new
+--------------------------------------------+
| ID | post_id | user_id | type |
+--------------------------------------------+
| 1 | 123 | 10 | up |
| 2 | 123 | 22 | down |
| 3 | 123 | 4 | up |
| 4 | 123 | 1 | up |
| 5 | 25 | 6 | up |
| 6 | 25 | 10 | up |
| 7 | 25 | 1 | down |
| 8 | 25 | 2 | up |
+--------------------------------------------+
除此之外,我还使用usermeta和Posteta存储帖子和用户投票的投票计数。
这里有一些虚构的元数据来帮助可视化。
Table: wp_postmeta
Type: core, existing
+-----------------------------------------------------------+
| meta_id | post_id | meta_key | meta_value |
+-----------------------------------------------------------+
| 512 | 123 | vote_count | 4 |
| 513 | 25 | vote_count | 4 |
+-----------------------------------------------------------+
Table: wp_usermeta
Type: core, existing
+-----------------------------------------------------------+
| umeta_id | user_id | meta_key | meta_value |
+-----------------------------------------------------------+
| 443 | 1 | vote_count | 2 |
| 445 | 2 | vote_count | 1 |
| 442 | 4 | vote_count | 1 |
| 444 | 6 | vote_count | 1 |
| 440 | 10 | vote_count | 2 |
| 441 | 22 | vote_count | 1 |
+-----------------------------------------------------------+
这样一来,可以根据元值对帖子进行排序,另外利用元表意味着可以快速访问更新和获取函数,如
get_user_meta
,
get_post_meta
,
update_post_meta
... 等等(我相信你明白了)。
只是大声想一想,因为你的问题让我思考我应该如何做得不同。。