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

Posted

技术标签:

【中文标题】MySQL 搜索不同的表并且只获取特定的 ID【英文标题】:MySQL search different tables and only fetch specfic IDs 【发布时间】:2013-09-10 10:17:03 【问题描述】:

我正在尝试创建一种算法来为特定 user_id 整理出最相关的数据。

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

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

我有一个名为:edu_posts 的表,其中包含给theese 的wallposts 和cmets。这张表中有不同的值,但我们应该关注的是: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 等等。

希望您能理解我的问题,如果您需要更多信息,请告诉我。

非常感谢!

【问题讨论】:

连接,需要 ON 语句来让一个表中的列关联到另一个表。等于某个值的列应该在where子句中移动 【参考方案1】:

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

例如

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

【讨论】:

好的。我读了一些关于观点的文章,因为我以前对此一无所知。有趣的!但是,我似乎是按内容分组的视图,至少,如果我有 2 个帖子,它们是由同一用户创建的,并且是同一用户创建的,那么它只会在视图中列出一次。 union 自动包含distinct。如果您想查看重复项,请使用union all 哇——代码很有意义。然后我想我只是合并所有我想从中收集数据的表,并且向查询中添加新表也很容易,因为可能会添加更多表。但是,我应该多久运行一次这个“创建视图”查询?每次加载墙页?在 cronjob 中?哪个最合适? 您只需要创建一次视图,但每次要添加/删除表或列时都需要更新定义。 视图将自动与源数据保持一致。当在视图中的任何表中添加或删除一行时,它将立即从视图结果中出现或消失。你不需要做任何事情。唯一需要更新视图定义的情况是添加或删除列或表。

以上是关于MySQL 搜索不同的表并且只获取特定的 ID的主要内容,如果未能解决你的问题,请参考以下文章

数据库中每个数据的类别由特定的 id 并且只允许为每个类别 mysql 获取 2

Elasticsearch 聚合顺序与搜索结果相同

索引如何加快搜索速度? [复制]

Redshift 创建列表并用它搜索不同的表

获取选择菜单以根据 MySQL SELECT 结果动态显示特定的选择选项

如何从 MySQL 数据库中搜索列名? [复制]