2012-01-30 27 views
0
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 

该查询的唯一不同的行返回喜欢的结果:我想修改该SQL语句返回列

enter image description here

我的问题是....我想修改该查询只选择DISTINCT fbid's。 (也许第一排只能按时间排序)

有人可以帮忙吗?

回答

1
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 

我不知道为什么你原来有LEFT JOIN的,因为它似乎所有的选秀权必须关联与一个有效的类别,选项和用户...我然后删除左侧,并改为INNER连接。

第一个内部查询抓取每个fbid,FIRST入口时间将导致一个单一的实体为FBID。从此,它重新加入到同一个ID和时隙的picks表中,然后继续其余的类别,选项,用户加入该单个条目的标准。

+0

感谢提供DRapp。我运行了你的脚本,并且真的关闭了,它仍然工作,但是仍然没有提供独特的FBID(它仍然显示同一个FBID的多行)。我觉得这很接近。你可以看到的任何调整? – Rees 2012-01-30 22:31:03

+0

@Rees,由于时间的重复,这可能是问题。 PICKS表中是否有唯一的主键?如果是这样,只需将MIN(TIME)更改为MIN(PRIMARYKEY),然后加入与MIN(PRIMARYKEY)匹配的PRIMARY KEY。 – DRapp 2012-01-30 23:52:17

+0

完美! picks.id做到了。谢谢drapp! – Rees 2012-01-31 00:58:37

0
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` 
+0

这不起作用,因为categories.name不是聚合的一部分。 – JonH 2012-01-30 20:22:19

+0

在发布代码时,请将其格式化(例如突出显示并按代码按钮“{}”,或缩进4个空格) – 2012-01-30 20:23:22

1

2个选项,你可以写一个group by子句。 或者您可以编写一个嵌入查询连接回自己以获取相关信息。

嵌套表别名:

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 
0
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等栏目。