Mysql

如何使用 count() 選擇隨機行

  • March 5, 2017

表名:

g_number  name
123       John
123       Sara
123       Michael

我想在一個查詢中獲得一個隨機名稱和具有相同 g_number 的所有名稱的數量:

SELECT name, count(*) cnt
FROM names
WHERE g_number='123'
ORDER BY rand()

但結果總是一樣的

name    cnt
John    3

看起來 count() 忽略了 ORDER BY rand() 行。所以這就是問題:是否有可能在一個查詢中解決這個問題?

我認為您想在一個查詢中做兩件不同的事情:

  1. 從所有的中隨機選擇一個 `name``WHERE g_number=123
  2. 計算所有WHERE g_number=123

如果這是您想要做的,請使用兩個子查詢:

SELECT
  (
    SELECT name
    FROM t
    WHERE g_number = 123
    ORDER BY rand()
    LIMIT 1
  ) AS name
  , (
    SELECT count(*)
    FROM t
    WHERE g_number = 123
  ) AS count_of_123

這會給你一個結果:

|    name | count_of_123 |
|---------|--------------|
|    Sara |            3 |

要麼

|    name | count_of_123 |
|---------|--------------|
| Michael |            3 |

要麼

|    name | count_of_123 |
|---------|--------------|
|    John |            3 |

您可以在http://sqlfiddle.com/#!9/5342d2/8/0查看

這不僅僅是 MySQL,它是標準 SQL(可能除了rand()函式名稱,它可能依賴於 DBMS)。該查詢還清楚地反映了您想要做兩件(相關但不同的)事情的事實。您還可以在 SQLFiddle 查看PostgreSQL 版本SQLite版本。


在 MySQL 的領域內,您可以使用一個也可以工作的非標準查詢(並且從性能方面來說,它可能更好):

SELECT
  name, count(*) AS count_of_123
FROM
  (
    SELECT name
    FROM t
    WHERE g_number = 123
    ORDER BY rand()
  ) AS q0 ;

我認為這更接近原始海報的想法。即便如此,我也不會依賴它。這與標準 SQL相差甚遠。MySQL可能決定在未來改變它的實現方式和行為方式。此外,恕我直言,查詢的意圖是什麼不太清楚。

在http://sqlfiddle.com/#!9/5342d2/10/0檢查它

引用自:https://dba.stackexchange.com/questions/166243