я хочу изменить этот оператор SQL, чтобы возвращать только отдельные строки столбца - PullRequest
0 голосов
/ 31 января 2012
select 
      picks.`fbid`, 
      picks.`time`, 
      categories.`name` as cname, 
      options.`name` as oname, 
      users.`name` 
   from 
      picks 
         left join categories 
            on (categories.`id` = picks.`cid`) 
         left join options 
            on (options.`id` = picks.oid) 
         left join users 
            on (users.fbid = picks.`fbid`) 
   order by 
      time desc

этот запрос возвращает результат, такой как:

enter image description here

мой вопрос ... Я хотел бы изменить запрос, чтобы выбрать только DISTINCT fbid.(возможно, первый ряд отсортирован только по времени)

Может кто-нибудь помочь с этим?

Ответы [ 4 ]

1 голос
/ 31 января 2012

2 варианта, вы можете написать группу по предложению. Или вы можете написать вложенный запрос, присоединенный к себе, чтобы получить соответствующую информацию.

Вложенная таблица псевдонимов:

SELECT
n.fBids
FROM
MyTable t 
INNER JOIN
(SELECT DISTINCT fBids
FROM MyTable) n
ON n.ID = t.ID

Или сгруппировать по опции

SELECT fBId from MyTable
GROUP BY fBID
1 голос
/ 31 января 2012
select
      p2.fbid,
      p2.time,
      c.`name` as cname, 
      o.`name` as oname, 
      u.`name` 
   from
      ( select p1.fbid, 
               min( p1.time ) FirstTimePerID
           from picks p1
           group by p1.fbid ) as FirstPerID

         JOIN Picks p2
            on FirstPerID.fbid = p2.fbid
           AND FirstPerID.FirstTimePerID = p2.time

            LEFT JOIN Categories c
               on p2.cid = c.id

            LEFT JOIN Options o
               on p2.oid = o.id

            LEFT JOIN Users u
               on p2.fbid = u.fbid
   order by 
      time desc

Я не знаю, почему у вас изначально были ЛЕВЫЕ СОЕДИНЕНИЯ, так как кажется, что все выборы должны быть связаны с действительной категорией, опцией и пользователем ... Я бы тогда удалил левую и вместо этого изменил бы их на ВНУТРЕННИЕ объединения.

Первый внутренний запрос захватывает для каждого fbid время ПЕРВОГО входа, что приводит к единственному объекту для FBID. После этого он снова присоединяется к таблице выбора для того же идентификатора и временного интервала ... затем продолжается для остальной части категории, параметры, пользователи присоединяются к критериям этой единственной записи.

0 голосов
/ 31 января 2012
select
    picks.fbid,
    MIN(picks.time) as first_time,
    MAX(picks.time) as last_time
from
    picks
group by
    picks.fbid    
order by
    MIN(picks.time) desc 

Однако, если вы хотите только отдельные fbid's, вы не можете одновременно отображать cname и другие столбцы.

0 голосов
/ 31 января 2012
select picks.`fbid`, picks.`time`, categories.`name` as cname,
options.`name` as oname, users.`name` from picks left join categories
on (categories.`id` = picks.`cid`) left join options on (options.`id` = picks.oid)
left join users on (users.fbid = picks.`fbid`)
order by time desc GROUP BY picks.`fbid`
...