簡體   English   中英

MySQL選擇COUNT(*)和具有最大日期的行

[英]MySQL Select COUNT(*) and Row with Max Date

我正在嘗試選擇按賣家分組的交易的COUNT(*)個及其最近的產品及其添加日期。 但是,由於某種原因,它似乎會繼續按創建日期對交易進行排序,即使我嘗試使用子查詢來防止這種情況,該交易也會不斷上升。 這是一個示例表:

------------------------------------------------
| ID | Provider |      URL        | CreateDate |
------------------------------------------------
| 1  | Prov1    | http://ex.com/1 | 2015-05-10 |
| 2  | Prov1    | http://ex.com/2 | 2015-06-10 |
| 3  | Prov1    | http://ex.com/3 | 2015-07-10 |
| 4  | Prov2    | http://ex.com/4 | 2015-05-10 |
| 5  | Prov2    | http://ex.com/5 | 2015-06-10 |
------------------------------------------------

我希望返回以下內容:

-----------------------------------------------------------
| ID | COUNT(*) | Provider |      URL        | CreateDate |
-----------------------------------------------------------
| 3  |    3     | Prov1    | http://ex.com/3 | 2015-07-10 |
| 5  |    2     | Prov2    | http://ex.com/5 | 2015-06-10 |
-----------------------------------------------------------

我當前的查詢是:

SELECT ID,COUNT(*),Provider,CreateDate,URL
FROM (SELECT * FROM products ORDER BY CreateDate DESC)
GROUP BY Provider;

但這似乎不起作用。 有人有建議嗎?

編輯謝謝大家的出色回答。 對我而言,極為奇怪的是,盡管它們似乎可以在SQL提琴中工作,但它們卻在我的數據庫服務器上失敗。 例如,在服務器上使用以下命令可提供以下功能:

mysql> INSERT INTO products
-> (`ID`, `Provider`, `URL`, `CreateDate`)
-> VALUES
-> (1, 'Prov1', 'http://ex.com/1','2015-05-10'),
-> (2, 'Prov1', 'http://ex.com/2','2015-06-10'),
-> (3, 'Prov1', 'http://ex.com/3','2015-07-10'),
-> (4, 'Prov2', 'http://ex.com/4','2015-05-10'),
-> (5, 'Prov2', 'http://ex.com/5','2015-06-10')
-> ;
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT ID,COUNT(*),Provider,CreateDate,URL
    -> FROM (SELECT * FROM products ORDER BY CreateDate DESC) t1
    -> GROUP BY Provider;
+------+----------+----------+---------------------+-----------------+
| ID   | COUNT(*) | Provider | CreateDate          | URL             |
+------+----------+----------+---------------------+-----------------+
|    1 |        3 | Prov1    | 2015-05-10 00:00:00 | http://ex.com/1 |
|    4 |        2 | Prov2    | 2015-05-10 00:00:00 | http://ex.com/4 |
+------+----------+----------+---------------------+-----------------+

在SQL小提琴上運行相同的東西時,按預期工作。 進一步,關於JOIN的評論應該起作用,但是我遇到同樣的問題,它返回了意外的結果。 我的MySQL版本是5.5.37-MariaDB-34.0。 有什么想法嗎?

SELECT p1.*, COUNT(*)
FROM products p1
JOIN
(
    select provider, max(CreateDate) as m_date
    from products 
    group by provider
) p2 on p1.provider = p2.provider and p1.CreateDate = p2.m_date

您需要在想要mysql返回計數內容的地方指定字段名稱:

select count(*) as nro from table;

在您的情況下:

SELECT ID,COUNT(*) as nro,Provider,CreateDate,URL
FROM (SELECT * FROM products ORDER BY CreateDate DESC)
GROUP BY Provider;

但對於所有解決方案,您都需要為此查詢“ SELECT * FROM products ORDER BY CreateDate DESC”的這一部分創建別名

CREATE VIEW p AS (SELECT * FROM products ORDER BY CreateDate DESC);

第二個查詢:

  SELECT ID,COUNT(*) as nro,Provider,CreateDate,URL
  FROM (p)
  GROUP BY Provider;

必須工作。

我是在SQL Server中完成的,但mysql中的查詢有效。

Create TABLE #Products(
Id int,
Provider varchar(50),
URL Varchar(300),
Createdate varchar(50)
)


INSERT INTO #Products

SELECT 1,'Prov1','http://ex.com/1 ','2015-05-10'  UNION ALL
SELECT 2,'Prov1','http://ex.com/2 ','2015-06-10'  UNION ALL
SELECT 3,'Prov1','http://ex.com/3 ','2015-07-10'  UNION ALL
SELECT 4,'Prov2','http://ex.com/4 ','2015-05-10'  UNION ALL
SELECT 5,'Prov2','http://ex.com/5 ','2015-06-10' 




SELECT p1.id, p2.Provider,p2.m_date,p1.url, COUNT(*)
FROM #products p1
JOIN
(
    select  provider, max(CreateDate) as m_date
    from #products 
    group by provider
) p2 on p1.provider = p2.provider and p1.CreateDate = p2.m_date
GROUP BY p1.id, p2.Provider,p2.m_date,p1.url

暫無
暫無

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

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