搜索具有不同字段的两个不同的MySQL表

时间:2013-03-01 22:47:17

标签: php mysql join union

我在这个主题上找到了帮助:Search different column names in different tables in MySQL但是他们只引用该主题中每个表的两个字段,而我无法通过搜索生成答案。

编辑:我也找到了这个帖子:Combine two tables that have no common fields,它提供了更多有用的信息,但我仍然无法弄清楚如何正确地组合这些

我从来没有必要创建JOINUNION查询,所以这对我来说都是新手。如果有一个简单的解决方案,请原谅我。

我需要运行一个查询来搜索具有完全不同字段的两个不同的数据库表。

以下是我想要合并为一个的两个查询:

"SELECT * FROM seekers 
    WHERE (first_name LIKE '%".$q."%') 
        OR (last_name LIKE '%".$q."%') 
        OR (username LIKE '%".$q."%') 
        OR (school LIKE '%".$q."%') 
        OR (major LIKE '%".$q."%') 
        OR (employer LIKE '%".$q."%') 
        OR (position LIKE '%".$q."%') 
        OR (background LIKE '%".$q."%') 
        OR (interests LIKE '%".$q."%') 
        OR (skills LIKE '%".$q."%')
    ORDER BY id DESC"

"SELECT * FROM companies 
    WHERE (company_name LIKE '%".$q."%') 
        OR (username LIKE '%".$q."%') 
        OR (industry LIKE '%".$q."%') 
        OR (slogan LIKE '%".$q."%')
        OR (location LIKE '%".$q."%') 
    ORDER BY id"

在查询之后,我想将所有字段都放入一个数组中并相应地显示数据。

我想我遇到的主要问题是决定如何组合表格?我想使用JOIN(内部还是外部)还是要使用UNION

我试图通过这样做来创建VIEW$this->mysqli->query("CREATE VIEW userTable AS (SELECT * FROM seekers) UNION ALL (SELECT * FROM companies)");但是这不起作用,我猜是因为这些表有很多不同的字段。

编辑:在尝试下面的一些答案后,我提出了这个问题:

SELECT first_name, last_name, username, school, major, employer, position, background, interests, skills 
    FROM seekers 
        WHERE (first_name LIKE '%".$q."%') 
        OR (last_name LIKE '%".$q."%') 
        OR (username LIKE '%".$q."%') 
        OR (school LIKE '%".$q."%') 
        OR (major LIKE '%".$q."%') 
        OR (employer LIKE '%".$q."%') 
        OR (position LIKE '%".$q."%') 
        OR (background LIKE '%".$q."%') 
        OR (interests LIKE '%".$q."%') 
        OR (skills LIKE '%".$q."%')
    UNION ALL 
        SELECT company_name, username, industry, slogan, location, NULL, NULL, NULL, NULL, NULL 
            WHERE (company_name LIKE '%".$q."%') 
                OR (username LIKE '%".$q."%') 
                OR (industry LIKE '%".$q."%') 
                OR (slogan LIKE '%".$q."%') 
                OR (location LIKE '%".$q."%') 

我删除了ORDER BY子句,因为我收到错误说“UNION和ORDER BY的使用不正确”,所以删除ORDER BY后我收到此错误:“查询失败:你有一个SQL语法错误;请检查与MySQL服务器版本对应的手册,以便在'WHERE(company_name LIKE'%0%')或(用户名LIKE'%0%')或(行业LIKE'%)附近使用正确的语法0%')'在第1行“

为什么$q在联合后的查询中变为0?

编辑#2:这是我放在一起实际返回数据的JOIN查询,但它不会返回正确的数据。我不知道这是否有助于回答这个问题,但我想我还是会把它放在这里。

"SELECT * FROM seekers t1 LEFT JOIN companies t2 ON t1.id = t2.id WHERE (t1.first_name LIKE '%".$q."%') OR (t1.last_name LIKE '%".$q."%') OR (t1.username LIKE '%".$q."%') OR (t1.school LIKE '%".$q."%') OR (t1.major LIKE '%".$q."%') OR (t1.employer LIKE '%".$q."%') OR (t1.position LIKE '%".$q."%') OR (t1.background LIKE '%".$q."%') OR (t1.interests LIKE '%".$q."%') OR (t1.skills LIKE '%".$q."%') OR (t2.company_name LIKE '%".$q."%') OR (t2.username LIKE '%".$q."%') OR (t2.industry LIKE '%".$q."%') OR (t2.slogan LIKE '%".$q."%') OR (t2.location LIKE '%".$q."%')"

抱歉上次查询时格式化,因此在粘贴时搞砸了。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用UNION,但为每个列名称添加别名。确保它们的顺序相同。见下面的例子:

SELECT first_name col1, last_name col2 etc etc FROM seekers 
    WHERE (first_name LIKE '%".$q."%') 
        OR (last_name LIKE '%".$q."%') 
        OR (username LIKE '%".$q."%') 
        OR (school LIKE '%".$q."%') 
        OR (major LIKE '%".$q."%') 
        OR (employer LIKE '%".$q."%') 
        OR (position LIKE '%".$q."%') 
        OR (background LIKE '%".$q."%') 
        OR (interests LIKE '%".$q."%') 
        OR (skills LIKE '%".$q."%')
    ORDER BY id DESC
UNION
SELECT company_name col1, username col2, etc etc FROM companies 
    WHERE (company_name LIKE '%".$q."%') 
        OR (username LIKE '%".$q."%') 
        OR (industry LIKE '%".$q."%') 
        OR (slogan LIKE '%".$q."%')
        OR (location LIKE '%".$q."%') 
    ORDER BY id

这将在同一结果集中将列匹配在一起。即,first_name和company_name将显示在col1中,依此类推。

注意

  1. 使用UNION,您需要在两个查询中选择相同数量的列。
  2. 您需要匹配数据类型
  3. 如果您需要伪造一个列,请使用null

答案 1 :(得分:1)

当您使用UNION时,您需要确保每个SELECT中的字段数相等。所以在上面的例子中你不应该使用'Select *' - 做这样的事情:

选择t1.field1,t1.field2,t1.field3,t1.field4,t1.field5,t1.field6
从......
哪里.....

联盟

选择t2.field1,t2.field2,t2.field3,t2.field4,'',''
从......
哪里.....

如果每个Select中的字段数不同,请添加一些空白字段即可。