一个搜索词,用于两个不同的表

时间:2012-06-18 23:40:52

标签: mysql join

我有以下问题:

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

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

帖子

POST_ID 用户身份 岗位 发布日期 可见

用户

用户标识 用户名 电子邮件 名字 名字

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

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

我知道group by clausule存在,所以我想对结果进行分组,首先是获取帖子然后是用户。

任何有关构建此查询的帮助都将深受赞赏。

的问候,Zoreli

2 个答案:

答案 0 :(得分: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)

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

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

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

答案 1 :(得分: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