2017-04-16 10 views
-1

私は現在have a question about thisですが、それは当然のことながら、その延長とエディションのためにそれが値する注意を受けているとは思いません。これで私は可能な限り簡潔にしようとします、行くことができます!行の位置を正しく取得しようとしています

私はこのSQLFiddle

私は現在、それに2つのクエリを持って

で、特定のテーブルの行の位置を取得しようとしています:の)(COUNTがある(コラムランクによってそれらを注文するすべての行を示しています1他の行)。特定の行の情報を取得するその他のものです。

SQLFiddleのこのスクリーンショットでは、現在の結果があり、黄色(位置の列のすぐ隣)に目的の結果があります。あなたはそれがあるべきとして「位置」は、おそらく、列IDに、いない列ランクを参照していることがわかります。

Current results/Desired result (in yellow)

どのように私は望ましい結果を達成することができますか?

スキーマ:

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!'); 

テストクエリ:

がケースでフィドルが、ここではすべてのDLLをロードだしない

/* 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

Do not duplicate理由が何であっても、同じ質問を2度お願いします。 – 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は最初のクエリで正確な結果を得ていますが、2番目のクエリではただ1つの行として "1"を返します。しかし、望む結果は、最初のクエリでそれと同等のユーザーのRownoを返すようにすることです:[link](http://image.prntscr.com/image/385eca4637954ec1bae214b3fd01a73d.png) –

+0

私はあなたが何を意味するかを見ます。あなたはPHPを使用しているので、それを使うことができます。最初のクエリから 'id'と' rowno'の関係が得られます。 '$ array [$ id] = $ rowNo'のように配列を作ることができます。 2番目のクエリについてレポートを作成するときに、その配列を使用できます。 MySQLだけを使用したい場合は、データを一時テーブルに格納することができます。 –

+0

ええ、これはphpによって行われたと想像することができますが、たとえば、100k +行のテーブルでユーザーの位置を探す必要がある場合、これはパフォーマンス面では適切ではありません。私は、特定のユーザの行番号(順位の位置)を示すMySQLを使用するだけの解決策を見ていくことは面白いと思っていました。 –

関連する問題