Как написать этот оператор SQL? - PullRequest
2 голосов
/ 01 сентября 2011

Вот таблица: Пользователь

Name:  Subject:
Peter   Math
Mary    Chinese
Mary    Computer
Mary    Hist
Mary    PE
Mary    English
Peter   Art
Chris   English
Chris   Computer
Peter   Computer
Paul    Math

Я хотел бы, чтобы верхняя часть отображалась в имени, а возвращаемая верхняя 4 результата должна быть именем субъекта.Например, в этом случае сверху появляется имя Мэри, а в основе - порядок в теме: китайский, компьютер, английский, поэтому я хотел бы получить результат:

Mary    Chinese
Mary    Computer
Mary    English
Mary    Hist

Если Мэри неДостаточно, чтобы показать результат, вторые люди будут следующие, например, скажем, таблица будет выглядеть так:

Name:  Subject:
Peter   Math
Mary    Chinese
Mary    Computer
Mary    Hist
Peter   Art
Chris   English
Chris   Computer
Peter   Computer
Paul    Math

Результат будет,

Mary    Chinese
Mary    Computer
Mary    Hist
Peter   Art

Потому что Мэрибольше всего появляется, поэтому Мэри вернется, но Марии недостаточно, чтобы заполнить 4 позиции, поэтому второе наиболее появившееся займет место, в данном случае мы используем Питера.

Ответы [ 2 ]

5 голосов
/ 01 сентября 2011
SELECT user.name, user.subject
FROM user
INNER JOIN (
    SELECT name, COUNT(1) AS occurrences
    FROM user
    GROUP BY name
  ) AS user_occurrences
  ON user.name = user_occurrences.name
ORDER BY user_occurrences.occurrences DESC, user.name ASC, user.subject ASC
LIMIT 4

edit Это может работать лучше, в зависимости от используемой СУБД и размера набора данных. Попробуйте оба и сравните.

SELECT user.name, user.subject
FROM user
INNER JOIN user AS user_occurrences
  ON user.name = user_occurrences.name
GROUP BY user.name --, user.subject Second GROUP BY not needed on MySQL, but it should logically be there
ORDER BY COUNT(user_occurrences.subject) DESC, user.name ASC, user.subject ASC
LIMIT 4
1 голос
/ 01 сентября 2011

выберите лучшие 4 из группы по имени, теме и отсортируйте по количеству

MSSQL-код:

select top 4 q.marketname, cc.countryname from (
select top 100  m.MarketName, m.MarketId, COUNT(m.marketname) as [count]  
from Common.Country c inner join Common.Market m on c.MarketId = m.MarketId
group by m.MarketName, m.MarketId order by COUNT(m.marketname) desc) 
q inner join Common.Country cc
on cc.MarketId = q.MarketId order by [Count] desc

Вы можете сделать аналогичный код MySQL

Вот подходящий MySQLКод

select q.name, cc.subject from (
  select m.Name, count(*) as Count
  from User m
  group by m.Name 
  order by COUNT(*) desc 
  LIMIT 100
) q 
inner join user cc on cc.Name= q.name 
order by Count desc 
LIMIT 4

Это устало, вы хотите решение без усилий?Разве вы не можете реализовать логику в своей технологии?Вы не должны понижать голос без понимания предложенного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...