MySQL搜索不同的表,只获取特定的ID

时间:2013-09-10 10:17:03

标签: php mysql sql performance query-optimization

我正在尝试创建一个算法来为特定的user_id排序最相关的数据。

我想我的最终结果是一个数组,其中KEY为找到的USER_ID,VALUE为在不同行中找到特定USER_ID的次数。

所以,我需要查看不同表中的不同行,并查找CURRENT_USER_ID(比如说id:30)的存在位置,然后找到RECIEVER_ID,即与之通信的用户。这很难解释,但让我们举一个例子:

  • 我有一张名为:edu_posts的表格,其中包含墙贴和对theese的评论。这个表中有不同的值,但我们应该关注的是:post_author和post_reciever。然后,我们必须查找post_author等于30的所有行(测试示例;只需要是当前用户ID),然后打印出post_reciever IDS。使用单个查询这很容易,但是我们必须在5个或10个不同的表中查找数据,这10个不同的查询,这很多。
  • 我们还有一个名为edu_folowers的表。在那里我们必须查找follow_author等于30的位置(测试示例;只需要是当前用户ID),然后打印出follow_user ID。再次,找出当前用户感兴趣的人。

我将最终的mysql_fetch想象成如下所示:

user_id => 25
times_found => 5
user_id => 11
times_found => 3
user_id => 95
times_found => 1

可以使用单个查询完成,也许使用JOIN?甚至可以在查询中计算结果,所以我不必在PHP代码中手动执行此操作。

或者我应该为每个希望从中获取数据的表创建一个mysql_query,然后使用PHP管理数据?这听起来对我来说是最简单的方法,但也是与脚本优化相关的效率最低的。

我已尝试使用以下测试查询:

SELECT
    u.user_id AS user_id,
    f.follow_user AS user_id_follow,
    p.post_reciever AS user_id_posts
FROM
    `edu_posts` u
LEFT JOIN `edu_followers` f ON f.follow_author = '30'
LEFT JOIN `edu_posts` p ON p.post_author = '30' && p.post_reciever != '30'
WHERE 
    u.user_id = '30'
GROUP BY
    f.follow_id, p.post_id

但问题是它输出了不可接受的结果,而且我将有不同的值来寻找,fx:user_id(不是真的需要,因为我们已经知道它是30),user_id_follow,user_id_posts等等。

我希望您理解我的问题,如果您需要其他信息,请告诉我们。

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

您可以创建要搜索的所有表的联合视图,具体取决于您可能只需要查询一次的确切要求。

e.g。

create view allPostTypesUnion as
select user_id, post_receiver
from   edu_posts
union
select user_id, post_receiver
from   different_edu_posts
union
select user_id, post_receiver
from   another_different_edu_posts

然后:

select post_receiver, count(*)
from   allPostTypes
group by post_receiver