繁体   English   中英

MySQL跨多个表选择不同的

[英]MySQL select distinct across multiple tables

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

如何合并这样的内容? 当我尝试这个时,它仍然

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

仅在选择列名而不是全部(*)时,distinct仅起作用吗? 参考中,它与列名的引用是不同的,而不是在所有表中。 有什么办法可以做到这一点?

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

抱歉,我刚回到计算机上。 另外,我只是意识到查询本身就是问题,与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

我遇到的问题(我认为与“与众不同”有关)是,如果在“朋友”表中发现值满足要求,那么“帖子”表的值也会出现。 这意味着当我显示SQL语句的输出时,似乎好像多次显示了Posts值,同时也显示了我正在寻找的实际值

输出将显示如下内容(注意各行中发布值之间的差异)

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值,但我也会得到更新的重复(仅在此示例中)

选择唯一的*时,将选择每一行,包括使记录唯一的一行。 如果您想要的东西比所获得的要好,则必须在select子句中键入各个列的名称。

我想你想要这个:

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

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

如果您多解释一下您要查询的表之间的连接,这将很容易,因为您可以使用联接,并集(如上所述)甚至分组依据...

您更新后的帖子将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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM