2017-04-16 37 views
-1

我目前have a question about this,但我不认为这是可能接受它的扩展名和版本的整个时间,因为它应有的重视。有了这个,我会努力尽可能简洁,放手!试图让行位置正确

我想获得一个特定的表的行位置,在此SQLFiddle

我现在有上2个查询:一个是列出了列级排序它们(这是一个COUNT所有行()其他行);和其他获得特定行信息的其他人。

在这个屏幕截图的SQLFiddle的,我目前的结果,并且在黄色(毗邻位置列)我有希望的结果。你可以看到,“位置”所指的可能是列ID,不列秩,因为它应该是:

Current results/Desired result (in yellow)

我怎样才能达到预期的效果?

万一小提琴不加载,这里的所有DLL:

模式:

CREATE TABLE IF NOT EXISTS `site_users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

INSERT INTO `site_users` (`id`, `username`) VALUES 
(1, 'Mateus'), 
(2, 'Marco'), 
(3, 'John'), 
(4, 'Luke'), 
(5, 'Wall'); 

CREATE TABLE IF NOT EXISTS `site_articles_comments` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `data` int(11) NOT NULL, 
    `comment` text NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

INSERT INTO `site_articles_comments` (`id`, `user_id`, `data`, `comment`) VALUES 
(1, 1, 1492101324, 'Too good to be true'), 
(2, 1, 1492101392, 'It\'s so, not very.'), 
(3, 1, 1492106262, 'I loved it!'), 
(4, 3, 1492107619, 'Seems fishy'), 
(5, 1, 1492108002, 'Don\'t blame it on her'), 
(6, 2, 1492108433, 'As I highly doubt it'), 
(7, 2, 1492200402, 'This is just a test'), 
(8, 2, 1492267629, 'Another test'), 
(9, 2, 1492267684, 'No sht'), 
(10, 4, 1492267766, 'WTF?'), 
(11, 2, 1492267796, 'Pics, pleaseee!'); 

测试查询:

/* This simply order users on rank (rank being number of comments) */ 
/* This query tries to get the row position of user based on rank */ 

SELECT x.id, 
     x.username, 
     x.rank, 
     x.position 
    FROM (SELECT u.id, 
       u.username, 
       @rownum := @rownum + 1 AS position, 
       (SELECT COALESCE(COUNT(DISTINCT(c.id)),0) AS rank 
        FROM site_articles_comments c 
        WHERE u.id = c.user_id ORDER BY rank DESC) AS rank 
      FROM site_users u 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY rank DESC) x; 

/* Based on the list above, user (Marco) should have a position number of 1 */ 

SELECT x.id, 
     x.username, 
     x.rank, 
     x.position 
    FROM (SELECT u.id, 
       u.username, 
       @rownum := @rownum + 1 AS position, 
       (SELECT COALESCE(COUNT(DISTINCT(c.id)),0) AS rank 
        FROM site_articles_comments c 
        WHERE u.id = c.user_id ORDER BY rank DESC) AS rank 
      FROM site_users u 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY rank DESC) x 
    WHERE x.id = 2 
+0

可能重复[获取不同行的COUNT()的行位置](http://stackoverflow.com/questions/43437680/get-row-position-of-count-of-distinct-rows) – Shadow

+1

不要无论原因是什么,都要问同样的问题两次。 – Shadow

+0

好的,然后我删除了原来的问题。 –

回答

0

什么你正在寻找可能是这样的:

SET @rowno2=0; 

SELECT x.id, 
     x.username, 
     x.rank, 
     x.position, 
     @rowno2:[email protected]+1 AS rowno 
    FROM (SELECT u.id, 
       u.username, 
       @rownum := @rownum + 1 AS position, 
       (SELECT COALESCE(COUNT(DISTINCT(c.id)),0) AS rank 
        FROM site_articles_comments c 
        WHERE u.id = c.user_id ORDER BY rank DESC) AS rank 
      FROM site_users u 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY rank DESC) x; 

SET @rowno2=0; 

SELECT x.id, 
     x.username, 
     x.rank, 
     x.position, 
     @rowno2:[email protected]+1 AS rowno 
    FROM (SELECT u.id, 
       u.username, 
       @rownum := @rownum + 1 AS position, 
       (SELECT COALESCE(COUNT(DISTINCT(c.id)),0) AS rank 
        FROM site_articles_comments c 
        WHERE u.id = c.user_id ORDER BY rank DESC) AS rank 
      FROM site_users u 
      JOIN (SELECT @rownum := 0) r 
     ORDER BY rank DESC) x 
    WHERE x.id = 2 

所以你可以使用一个MySQL变量来跟踪行号。

我没有看过你的SQL的其余部分。

+0

你好,谢谢你的回答!不幸的是,这不完全是我想要做的。 Rowno在第一个查询中给了我准确的结果,但在第二个查询中,它只返回“1”,因为它只是一行。但期望的结果是有它返回相当于用户的Rowno在第一个查询:[链接](http://image.prntscr.com/image/385eca4637954ec1bae214b3fd01a73d.png) –

+0

我明白你的意思。你正在使用PHP,所以你可以使用它。从第一个查询中,你可以得到'id'和'rowno'之间的关系。你可以像这样创建一个数组:'$ array [$ id] = $ rowNo'。您可以在报告第二个查询时使用该数组。如果您只想使用MySQL,则可以将数据存储在临时表中。 –

+0

是的,我能想象通过PHP这个工作,但我不认为这是正确的在性能方面,例如如果,我要寻找一个用户在一个表100K +行的位置。我认为看到只使用MySQL的解决方案会很有趣,其中一个显示特定用户的行号(排名位置)。 –