【发布时间】:2013-02-02 21:32:57
【问题描述】:
我有一个从多个表中选择所有列的查询,但它返回多个相同值(我只想要不同的值)。
我怎样才能合并这样的东西?当我尝试这个时,它仍然是
Select Distinct A.*, B.*, C.*....
是否仅在选择列名而不是全部 (*) 时才起作用?在this 参考中,它在引用列名时表示不同,而不是在所有表中。有什么办法可以做到吗?
编辑 - 我在下面添加了更多信息
对不起,我刚回到我的电脑上。另外,我刚刚意识到我的查询本身就是问题所在,而 Distinct 与此无关。
所以,我的查询的总体目标是执行以下操作
- 生成用户的好友列表
- 浏览好友并查看他们的活动(发帖、添加好友等)
- 显示按日期排序的朋友列表和他们的活动(我猜想像 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)。还有一些简单的数据可以显示您声称的非唯一性——输入表和样本数据以及输出。两张表应该足以说明;三个就足够了。