【问题标题】:one search term, for two different tables一个搜索词,用于两个不同的表
【发布时间】:2012-06-18 23:40:52
【问题描述】:

我有以下问题:

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

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

帖子

post_id 用户身份 邮政 发布日期 可见

用户

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

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

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

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

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

问候,佐雷利

【问题讨论】:

  • 另外,是否可以计算有多少结果来自帖子表以及有多少结果来自用户表?

标签: mysql join


【解决方案1】:

如果两个表都是相同的架构,你可以

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)

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

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

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

【讨论】:

    【解决方案2】:

    这样的方法可行,但它不是一个非常优雅的解决方案。

    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
    

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多