2016-07-10 59 views
1

她是我的表:如何根據N來製作近似數字並接近現實?

// users 
+----+--------+------------+----------------+------------+ 
| id | name | reputation |  avatar  | visibility | 
+----+--------+------------+----------------+------------+ 
| 1 | John | 344  | er0942334r4... | 1   | 
| 2 | Peter | 65544  | 340ojfc343f... | 0   | 
+----+--------+------------+----------------+------------+ 

// posts 
+----+--------+------------+-----------+ 
| id | title | content | author_id | 
+----+--------+------------+-----------+ 
| 1 | title1 | content1 | 2   | 
| 2 | title2 | content2 | 1   | 
+----+--------+------------+-----------+ 

這裏是我的查詢:

SELECT p.*, 
     COALESCE(u.name,'NoName') as `name`, 
     u.reputation as `rep`, 
     COALESCE(u.avatar,'default') as avatar 
FROM posts p 
LEFT JOIN users u 
ON u.id = p.author_id AND u.visibility = 1 

這裏是當前輸出:

+----+--------+------------+-----------+--------+------+----------------+ 
| id | title | content | author_id | name | rep |  avatar  | 
+----+--------+------------+-----------+--------+------+----------------+ 
| 1 | title1 | content1 | 2   | NoName |  | default  | 
| 2 | title2 | content2 | 1   | John | 344 | er0942334r4... | 
+----+--------+------------+-----------+--------+------+----------------+ 

正如你看到的,rep列將在user.visibility = 1之內爲空。現在我想從users.reputation的實際值創建一個近似數字並接近實際,並將其設置在那裏。

因此,這裏是預期結果:

+----+--------+------------+-----------+--------+------+----------------+ 
| id | title | content | author_id | name | rep |  avatar  | 
+----+--------+------------+-----------+--------+------+----------------+ 
| 1 | title1 | content1 | 2   | NoName | +5k | default  | 
| 2 | title2 | content2 | 1   | John | 344 | er0942334r4... | 
+----+--------+------------+-----------+--------+------+----------------+ 

這裏是所有可能的情況下爲rep

  • 1
  • +100
  • +1k
  • +5k
  • +20k
  • +100k

我怎麼能這樣做?

回答

3

您需要重新構造查詢,將「可見性」邏輯移動到SELECT

我不知道確切的邏輯是什麼rep,但這裏有一個例子:

SELECT p.*, 
     (CASE WHEN u.visibility = 1 THEN u.name ELSE 'NoName' END) as `name`, 
     (CASE WHEN u.visibility = 1 THEN CAST(u.reputation as VARCHAR) 
      WHEN rep < 100 THEN '1' 
      WHEN rep < 1000 THEN '+100' 
      . . . 
     END) as `rep`, 
     (CASE WHEN u.visibility = 1 THEN u.avatar ELSE 'default' END) as avatar 
FROM posts p LEFT JOIN 
    users u 
    ON u.id = p.author_id; 

這假定rep存儲爲表中的一個數字。但是,輸出的值需要是字符串。

+0

很好......謝謝,upvote。 –

+0

你的解決方案完美無缺......但對我來說有一個模糊的東西:我的查詢速度要快得多,爲什麼?我創建了一個基準和1000次執行,**我的:2.4秒**,**你的:4.7秒**。爲什麼? –

+0

@MartinAJ。 。 。這個版本需要處理'用戶'中的所有行。如果大多數可見性標誌設置爲「0」,那麼這將過濾掉大量數據。我有點驚訝,表現的差異會是(相對)大,但它可能會有所作爲。 –