2013-03-01 84 views
1

我在这个主题找到帮助:Search different column names in different tables in MySQL但他们只引用该主题中的每个表的两个字段,我无法从我的搜索生成一个答案。搜索两个不同的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和秩序BY“,所以在删除ORDER BY后,我得到这样的错误:”查询失败:你的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,查找'WHERE(company_name LIKE'%' 0%')OR(用户名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."%')" 

对于最后一个查询的格式化感到抱歉,所以在粘贴时弄错了它。

+0

也许这将帮助:http://stackoverflow.com/questions/7407864/mysql-select-union- for-different-columns – 2013-03-01 23:13:46

回答

1

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

Select t1.field1,t1.field2,t1.field3,t1.field4,t1.field5,t1.field6
来自.....
哪里..​​...

联盟

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

如果每个Select中的字段数量不同,请添加一些空白字段以使其达到最大。

+0

我会试试这个。这是做这种事最简单的方法吗? – 2013-03-01 23:09:02

+0

我愿意纠正,但它可能是最直接的方式! – kbbucks 2013-03-01 23:22:40

+0

我更新了我的问题,并通过查询生成了您的问题和杰克的答案,但我仍然无法使其工作。你能查看它看我哪里出错了吗? – 2013-03-01 23:29:18

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. 如果您需要假一列使用空
+0

我用一些代码更新了我的问题。请查看它,看看你能否告诉我哪里出错了。 – 2013-03-01 23:22:41

+0

为每列添加一个别名并查看是否得到相同的错误。这两个查询中的别名必须相同。 'first_name col1'和'company_name col1','last_name col2'和'username col2'等等 – 2013-03-01 23:32:44

+0

我试着添加别名,它不起作用。我创建了一个返回数据的JOIN查询,但它不是正确的数据。我用那个查询更新了我的问题。 – 2013-03-01 23:39:04

相关问题