【问题标题】:MySQL select distinct across multiple tablesMySQL在多个表中选择不同的
【发布时间】:2013-02-02 21:32:57
【问题描述】:

我有一个从多个表中选择所有列的查询,但它返回多个相同值(我只想要不同的值)。

我怎样才能合并这样的东西?当我尝试这个时,它仍然是

Select Distinct A.*, B.*, C.*....

是否仅在选择列名而不是全部 (*) 时才起作用?在this 参考中,它在引用列名时表示不同,而不是在所有表中。有什么办法可以做到吗?

编辑 - 我在下面添加了更多信息

对不起,我刚回到我的电脑上。另外,我刚刚意识到我的查询本身就是问题所在,而 Distinct 与此无关。

所以,我的查询的总体目标是执行以下操作

  1. 生成用户的好友列表
  2. 浏览好友并查看他们的活动(发帖、添加好友等)
  3. 显示按日期排序的朋友列表和他们的活动(我猜想像 facebook 墙上的交易)。

这是我的桌子

update_id |  update | userid  | timestamp  //updates table

post_id |  post | userid  | timestamp      //posts table

user_1 |   user_2  | status   |  timestamp   //friends table

这是我的查询

SELECT U.* , P.* ,F.* FROM posts AS P 
JOIN updates AS U ON P.userid = U.userid 
JOIN friends AS F ON P.userid = F.user_2 or F.user_1
WHERE P.userid IN (
        select user_1 from friends where user_2 = '1'
        union
        select user_2 from friends where user_1 = '1'
        union
        select userid from org_members where org_id = '1'
        union
        select org_id from org_members where userid = '1'
        ) 
ORDER BY P.timestamp, U.timestamp, F.timestamp limit 30

我遇到的问题(我认为与 distinct 相关)是,如果发现值满足表 Friends 中的要求,则 Posts 表的值也会出现。这意味着当我显示 SQL 语句的输出时,看起来好像 Posts 值显示了多次,而我正在查找的实际值也显示了

输出将显示如下(注意行中的 post 值之间的差异)

update_id |  update | userid  | timestamp | post_id |  post | userid  | timestamp | user_1 |   user_2  | status   |  timestamp

     1    | update1 |   1    | 02/01/2013 |    1    |  post1|  1      |  2/02/2013|  1     |   2       |  1       | 01/30/2013
     1    | update1 |   1    | 02/01/2013 |    2    |  post2|  1      |  2/03/2013|  1     |   2       |  1       | 01/30/2013

所以,如您所见,我认为我遇到了一个明显的问题(因为 update1 出现了两次),但查询实际上只是选择了所有值。我在 Post 表中得到了我要查找的结果,但返回了所有其他值。因此,当我在 PHP/HTML 中显示表格时,将显示 Post 值,但我也会得到更新的副本(仅用于此示例)

【问题讨论】:

  • 这些表有什么关系?听起来也许你应该做一个UNION...发布他们的架构。
  • 你能提供一个你正在使用的数据和你想要的结果的例子吗? SELECT DISTINCT 有效。您对它所做的事情的期望需要更新。
  • 你那里没有一些 auto_increment 吗?这个问题太模糊了……
  • Seems to work,或者这不是你想要的?
  • 也许您应该显示整个 SELECT — FROM 子句及其 JOIN(或 FROM 子句和 WHERE 子句,如果您不使用 JOIN)。还有一些简单的数据可以显示您声称的非唯一性——输入表和样本数据以及输出。两张表应该足以说明;三个就足够了。

标签: mysql sql distinct


【解决方案1】:

当您选择 distinct * 时,您会选择每一行,包括使记录唯一的那一行。如果你想要比你得到的更好的东西,你必须在你的 select 子句中输入各个列的名称。

【讨论】:

  • 我更新了上面的帖子。你能看看我的编辑吗?
【解决方案2】:

如果您多解释一下您正在查询的表之间的联系是什么就很容易了,因为您可以使用联接、联合(如上所述)甚至是 group by ...

【讨论】:

  • 我更新了上面的帖子。抱歉信息不足。我出去了一会儿,才回到我的电脑上。
【解决方案3】:

您更新后的帖子显示的 JOIN 条件之一为:

JOIN friends AS F ON P.userid = F.user_2 OR F.user_1

这相当于:

JOIN friends AS F ON (P.userid = F.user_2 OR F.user_1  != 0)

并将包含许多您不打算包含的行。 您可能打算:

JOIN friends AS F ON (P.userid = F.user_2 OR P.userid = F.user_1)

【讨论】:

    【解决方案4】:

    我想你想要这个:

    select *
    from tableA
    union
    select * 
    from tableB
    union
    select * 
    from tableC
    

    这假设 HHS 表都具有相同数量的列并且它们具有相同的数据类型。这不是,您必须选择特定的列才能做到这一点。

    【讨论】:

    • 我对延误表示歉意。我出去了,刚回来。我更新了我上面的帖子
    • 更新彻底改变了问题。您应该恢复您的更改,放弃这个问题,并提出一个新问题。
    • @Dalius 就是这样!已编辑:)
    猜你喜欢
    • 2011-02-16
    • 2018-07-31
    • 2022-01-18
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多