2013-03-01 80 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