0

我有以下问题:

我有一个搜索框,用户可以在其中搜索帖子、用户名或电子邮件。

帖子在我的帖子表中,用户位于我的用户表中。表具有以下结构:

帖子

post_id user_id post post_date 可见

用户

用户名 用户名 电子邮件 名字 姓氏

我可以通过一个查询从两个表中获取结果吗?不知道这对我有什么好处(如果有的话),只是问问。

然后我应该在同一页面上显示结果,但首先发布,然后是用户。如您所见,帖子将显示不同的数据,用户将显示不同的数据。

我知道存在按条款分组,所以我想对结果进行分组,首先获取帖子,然后获取用户。

任何有关构建此查询的帮助将不胜感激。

问候,佐雷利

4

2 回答 2

0

如果表都是相同的模式,你可以

SELECT fields from posts where (yadda = 1)
UNION 
SELECT fields from users where (yadda = 1)

但是,这是不可能的,因为您的表具有不同的架构和数据类型(即 post_date 可能是日期时间,而 users 表中的相应字段是 firstname,它是一个字符串)

理论上,您可以通过使用仅针对帖子或用户有条件地填充的虚拟字段来解决此问题...

SELECT 'P' as result_type, post_id, user_id, post_date, visible, NULL as username, NULL as email, NULL as firstname, NULL as lastname from posts where (yadda = 1)
UNION ALL
SELECT 'U', NULL, userid, NULL, NULL, username, email, firstname, lastname from users where (yadda = 1)

但这是一种非常糟糕的做事方式。您正在传输更多数据,然后必须编写逻辑代码来检查它是什么类型的行,并询问相关字段。

所以简单的答案是只发出两个单独的查询。

我唯一推荐上述方法的是,如果您有一些复杂的基于数据库的排序顺序,这意味着您必须将帖子记录与用户记录合并。从你的问题来看,这听起来不太可能。

于 2012-06-19T00:13:25.143 回答
0

像这样的东西会起作用,但这不是一个非常优雅的解决方案。

SELECT q.post_id, q.post_user_id, q.post, q.post_date, q.post_visible,
       q.user_id, q.username, q.user_email, q.user_first, q.user_last
FROM   (
       SELECT post_id, user_id AS post_user_id, post, post_date, visible AS post_visible,
              0 AS user_id, "" AS username, "" AS user_email, "" AS user_first, "" AS user_last
       FROM   posts
       WHERE  post like ?
  UNION
       SELECT 0 AS post_id, "" AS post_user_id, "" AS post, "" AS post_date, 0 AS post_visible,
              userid AS user_id, username, email AS user_email, firstname AS user_first, lastname AS user_last
       FROM   users
       WHERE  username like ?
       OR     email like ?
       ) q
ORDER BY q.post_id DESC
于 2012-06-19T00:15:27.150 回答