簡體   English   中英

SQL SELECT 僅當記錄數大於N時顯示記錄

[英]SQL SELECT showing records only if the number of records is greater than N

我有一個這樣定義的表(MySQL 5.1):

CREATE TABLE mysql_test_a ( 
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
firstname VARCHAR(30) NOT NULL, 
lastname VARCHAR(30) NOT NULL,  
email VARCHAR(50), 
reg_date TIMESTAMP 
); 

示例數據集:

INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('1', 'Marcello', 'Santucci', 'marcello@tux.net', CURRENT_TIMESTAMP); 
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('2', 'Mike', 'Santucci', 'mike@tux.net', CURRENT_TIMESTAMP); 
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('3', 'Anna Maria', 'Gabriele', 'anna.maria@gabriele.net', CURRENT_TIMESTAMP); 
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('4', 'Matilde Josefa', 'Santucci', 'matilde.josefa@tux.net', CURRENT_TIMESTAMP); 
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('5', 'Milena', 'Santucci', 'mile@tux.net', CURRENT_TIMESTAMP); 
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('6', 'Luca', 'Pensa', 'luca@pensa.net', CURRENT_TIMESTAMP); 
INSERT INTO `mysql_test_a` (`id`, `firstname`, `lastname`, `email`, `reg_date`) VALUES ('7', 'Lorenzo', 'Pensa', 'lo@pensa.net', CURRENT_TIMESTAMP); 

僅當記錄數大於某個定義的限制(假設為 2)時,我才需要顯示符合特定條件的記錄(假設lastname = 'Santucci' )。 我以各種方式嘗試但沒有成功,最有希望的形式是:

SELECT
    id,
    firstname,
    lastname
FROM
    mysql_test_a
WHERE
    lastname = 'Santucci'
HAVING COUNT(*) > 2

它只返回第一條記錄。

我更願意使用類似這種形式的東西,因為 HAVING 子句將允許使用參數。

--- 最新更新 ---

我必須更具體地說明解決方案:我正在尋找不處理內部SELECT的東西,更具體地說是它的WHERE子句,因為正如我指出的那樣,提供的那個是非常虛構的(即它可能完全不同從此復雜得多)。 當然,我很欣賞任何其他提示。

您可以在查詢中使用子查詢,如下所示:

SELECT id, firstname, lastname
FROM mysql_test_a a
WHERE lastname = 'Santucci'
  and (select count(1) from mysql_test_a b where b.lastname  = a.lastname) > 2

您可能正在尋找這個:

SELECT 
 *
 FROM
    (SELECT 
        id, 
        firstname, 
        lastname
    FROM
        mysql_test_a
    WHERE
        lastname = 'Santucci') a,
    (SELECT 
        id, 
        firstname, 
        lastname
    FROM
        mysql_test_a
    WHERE
        lastname = 'Santucci'
    HAVING COUNT(*) > 2) b
WHERE
    a.lastname = b.lastname

我猜你的結果是

1 Marcello Santucci

但你想要這樣的東西:

1   Marcello        Santucci
2   Mike            Santucci
4   Matilde Josefa  Santucci
5   Milena          Santucci

在這種情況下,您可以使用此查詢,類似於@Popeye 的建議:

SELECT id, firstname, lastname
FROM mysql_test_a tbl
WHERE (SELECT count(*) FROM mysql_test_a sbq WHERE sbq.lastname  = tbl.lastname) > 2

或這個,基於“in”運算符的用法

SELECT * from mysql_test_a
WHERE lastname IN (
    SELECT lastname
    FROM mysql_test_a
    GROUP BY lastname
    HAVING COUNT(lastname) >2
)

您可以添加“WHERE”子句以將結果限制為“Santucci”,但我認為您對更通用的答案感興趣。

我還准備了一個小提琴,你可以玩http://sqlfiddle.com/#!9/b1a727/16

如果您運行的是 MySQL 8.0,我建議使用 window 計數:

select id, firstname, lastname
from (
    select t.*, count(*) over() as cnt
    from mysql_test_a a
    where lastname = 'Santucci'
) t
where cnt > 2

我們可以將其概括為一次處理多個姓氏:

select id, firstname, lastname
from (
    select t.*, count(*) over(partition by lastname) as cnt
    from mysql_test_a a
) t
where cnt > 2
order by lastname

最有效的方法可能exists

select t.*
from mysql_test_a t
where lastname = 'Santucci' and
      exists (select 1
              from mysql_test_a t2 
              where t2.lastname = t.lastname and
                    t2.id <> t.id
             );

為了提高性能,您需要在mysql_test_a(lastname)上建立索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM