MySQL在多个表中选择不同

时间:2013-02-02 21:32:57

标签: mysql sql distinct

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

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

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

distinct只在选择列名而不是全部(*)时才有效吗?在this引用中,它表示与列名称不同,而不是在所有表中。我有什么方法可以做到这一点吗?

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

对不起伙计们,我刚回到我的电脑前。此外,我刚刚意识到我的查询本身就是问题,而Distinct与它无关。

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

  1. 生成用户拥有的朋友列表
  2. 浏览朋友并查看他们的活动(发帖,添加朋友等)。
  3. 显示按日期排序的朋友及其活动列表(我猜想像Facebook墙一样)。
  4. 这是我的表格

    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值多次显示,当我正在寻找的实际值也显示时

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

    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值,但我也会获得更新的重复项(仅适用于此示例)

4 个答案:

答案 0 :(得分:0)

当您选择不同的*时,您选择每一行,包括使记录唯一的那一行。如果你想要比你得到的更好的东西,你必须在select子句中键入单独的列名。

答案 1 :(得分:0)

我想你想要这个:

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

这假设HHS表具有相同的列数并且它们具有相同的数据类型。不是这样,你必须选择特定的列来实现它。

答案 2 :(得分:0)

如果你再详细解释一下你所查询的表之间的联系会很容易,因为你可以使用联接,联合(如上所述)甚至分组...

答案 3 :(得分:0)

您更新的帖子显示以下其中一个加入条件:

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)