【问题标题】:i want to modify this SQL statement to return only distinct rows of a column我想修改此 SQL 语句以仅返回一列的不同行
【发布时间】:2012-01-30 20:16:55
【问题描述】:
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

该查询返回如下结果:

我的问题是....我想修改查询以仅选择 DISTINCT fbid。 (可能第一行只按时间排序)

有人可以帮忙吗?

【问题讨论】:

    标签: sql select mysqli distinct


    【解决方案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 抓取,第一个进入时间将导致 FBID 的单个实体。从那以后,它重新加入到相同 ID 和时间段的选择表...然后继续为该单个条目的其余类别、选项、用户加入条件。

    【讨论】:

    • 感谢 DRapp 的提醒。我运行了您的脚本并且非常接近,它按原样工作,但是仍然没有提供不同的 FBID(它仍然显示同一个 FBID 的多行)。我觉得这真的很接近。你能看到任何调整吗?
    • @Rees,由于时间重复,这可能是问题所在。 PICKS 表上是否有唯一的主键?如果是这样,只需将 MIN(TIME) 更改为 MIN(PRIMARYKEY) 并加入与 MIN(PRIMARYKEY) 匹配的 PRIMARY KEY。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:
      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`
      

      【讨论】:

      • 这不起作用,因为 categories.name 不是聚合的一部分。
      • 发布代码时,请按此格式(例如突出显示并按代码按钮{},或缩进4个空格)
      【解决方案4】:
      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 和其他列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 2019-09-07
        相关资源
        最近更新 更多