2015-07-16 3 views
0

Я пытаюсь выбрать COUNT (*) сделок, сгруппированных продавцом, вместе с их последним продуктом и датой его добавления. Однако по какой-то причине он, по-видимому, продолжает упорядочивать сделки по дате создания, поднимаясь, даже когда я пытаюсь выполнить подзапросы, чтобы предотвратить это. Ниже приведен пример таблицы:MySQL Выберите 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; 

Но это не похоже на работу. У кого-нибудь есть предложение?

EDIT Благодарим всех вас за отличные ответы. Для меня очень странно, что, хотя они, похоже, работают в скрипте 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. Есть идеи по этому поводу?

+0

необходимо заказывать во внешнем запросе, так как вы группируете, mysql может повторно упорядочить набор результатов подзапроса, но он хочет. –

ответ

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 
0

Вам необходимо указать имя поля, где вы хотите 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; 

должна быть работа.

0

Я сделал это в 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 
Смежные вопросы