2013-05-18 4 views
0

Мои таблицы выглядит следующим образом:порядок MySQL по со счетом и группой по вопросам

# Table user 

user_id PK 
... 

# Table buy 

buy_id PK 
user_id FK 
... 

# Table offert 

offert_id 
user_id 
... 

Ну я должен знать последний «купить» 1 «пользователя» и получить счетчик «offert» этого «пользователь 'имеет, я пытался что-то вроде:

select b.buy_id,count(distinct c.offert_id) as cv from user a 
inner join buy b using(user_id) left join offert c using(user_id) where a.user_id=4 
group by a.user_id order by b.buy_id desc 

, но она всегда возвращает первый „купить“ не последний, выглядеть так порядке, не делает никакого эффекта

Я знаю, что я могу это сделать с sub-запросами, но я хотел бы знать, есть ли способ сделать это с использованием вспомогательных запросов, возможно, используя max-функции, но idk, как это сделать.

спасибо.

+0

Вы уверены, что ваш buy_id является автоматическим приращением? –

+0

да этот столбец auto increment – user2379521

+0

Я отредактировал мой вопрос i forget the 'where'. – user2379521

ответ

0

Ваш подход просто не гарантированно работает. Одна большая причина заключается в том, что group by обрабатывается до order by.

Предполагая, что вы имеете в виду самый большой buy_id для каждого пользователя, вы можете сделать это так:

select u.user_id, u.last_buy_id, count(distinct o.offert_id) 
from (select u.*, 
      (select buy_id from buy b where u.user_id = u.user_id order by buy_id desc limit 1 
      ) last_buy_id 
     from user u 
    ) left outer join 
    offert o 
    on o.user_id = u.user_id 
group by u.user_id; 

Первый подзапрос использует связанный подзапрос, чтобы получить последний купить идентификатор для каждого пользователя. Затем он объединяется в offert и выполняет агрегацию. Обратите внимание, что эта версия включает user_id в агрегации.

+0

Я не поклонник подзапросов, но в этом случае думаю, что мне нужно будет его использовать. – user2379521

+0

@ пользователь2379521. , , Мой комментарий об этом. Если вам не нравятся коррелированные подзапросы, обновите базу данных, которая поддерживает функции окна. На мой взгляд, это устраняет более половины потребности в таких подзапросах. –