2015-03-31 62 views
1

如何在同一個表上進行多個查詢,選擇不同的列?將同一個表上的多個MySQL查詢合併爲一個

如果它有幫助......所有查詢在SQL語句的選擇部分都有一個共同的列。他們都選擇了ID,然後是特定的東西。

因此,每個查詢需要ID和以下任一項:post_name,post_titlepost_excerpt

此外,如果它有助於簡化事情。我正在嘗試在這些列中搜索廣泛匹配項和精確匹配項。

所以在我的示例中,我將查找:「floor finish」,「floor」或「finish」在以下列中:post_name,post_titlepost_excerpt。全部在同一張表內。

我試圖用UNION來實現這個。

這裏是我的查詢:

Array 
(
    [broad] => Array 
     (
      [floor] => Array 
       (
        [slugs] => SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor%' 
        [titles] => SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor%' 
        [excerpts] => SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor%' 
       ) 

      [finish] => Array 
       (
        [slugs] => SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%finish%' 
        [titles] => SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%finish%' 
        [excerpts] => SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%finish%' 
       ) 

     ) 

    [exact] => Array 
     (
      [slugs] => SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor-finish%' 
      [titles] => SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor finish%' 
      [excerpts] => SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor finish%' 
     ) 

    [combined] => (SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor-finish%') UNION (SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%floor%') UNION (SELECT `ID`, `post_name` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_name` LIKE '%finish%') UNION (SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor finish%') UNION (SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%floor%') UNION (SELECT `ID`, `post_title` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_title` LIKE '%finish%') UNION (SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor finish%') UNION (SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%floor%') UNION (SELECT `ID`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND `post_excerpt` LIKE '%finish%') 
) 

然而,上述結果是有趣的。我似乎得到所有正確的結果,除了每個結果值(應該是列的名稱)的關鍵字始終保持不變。即使分配給它的值可能是post_titlepost_excerpt,它始終爲post_name

所以每個結果都有一個IDpost_name。基本上他們的鑰匙是錯的,但是這些數值似乎是準確的。

我也嘗試過這樣的事情:

Array 
     (
      [broad] => Array 
       (
        [floor] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND (`post_name` LIKE '%floor%' OR `post_title` LIKE '%floor%' OR `post_excerpt` LIKE '%floor') 
        [finish] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND (`post_name` LIKE '%finish%' OR `post_title` LIKE '%finish%' OR `post_excerpt` LIKE '%finish%') 
       ) 

      [exact] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND (`post_name` LIKE '%floor-finish%' OR `post_title` LIKE '%floor finish%' OR `post_excerpt` LIKE '%floor finish%') 
      [combined] => SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND (`post_name` LIKE '%floor-finish%' OR `post_title` LIKE '%floor finish%' OR `post_excerpt` LIKE '%floor finish%') UNION (SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND (`post_name` LIKE '%floor%' OR `post_title` LIKE '%floor%' OR `post_excerpt` LIKE '%floor%')) UNION (SELECT `ID`, `post_name`, `post_title`, `post_excerpt` FROM tps_3_posts WHERE `post_status` = 'publish' AND (`post_name` LIKE '%finish%' OR `post_title` LIKE '%finish%' OR `post_excerpt` LIKE '%finish%')) 
     ) 

) 

這是沿着什麼,我試圖完成的線條更。我希望每個結果都有ID,post_excerpt,post_slugpost_title。如果沒有匹配,則顯示它們的鍵值爲空,或者完全不顯示該鍵。

第二次嘗試的問題是,它只需要三個所需列中的一個匹配。因此,如果它匹配post_excerpt而沒有其他地方,它仍然會從post_titlepost_name中提取值。從而導致結果不準確。

我已經閱讀了幾個似乎是類似的問題,但大多數都沒有真正明確的答案......或者...問題/答案更適合於SEPARATE表上的多個查詢。

關於在同一個表上組合多個MySQL查詢的任何指導或建議?

BY THE WAY ...我在我的例子中使用「組合」作爲我的最終查詢發送到數據庫。

所以再一次......如果列中沒有匹配,則顯示它們爲空或完全忽略結果中的鍵。

+0

這正是我爲什麼不經常使用這個網站的原因。每個人都喜歡傲慢和無用,而不是建設性和有益的。 – 2015-03-31 22:03:52

+0

你爲什麼這麼說? – 2015-03-31 22:49:22

+0

我發表的評論是針對做出粗暴評論的人的迴應。要麼他自己刪除它,要麼是主持人。 – 2015-04-01 16:25:00

回答

2

由於查詢中的UNION語句,您得到錯誤的「密鑰」。您有不同的鍵名稱,但是三個不同列之間的兼容列類型是聯合查詢。而不是拋出一個錯誤,數據庫引擎剛剛從第一個查詢選擇列名和使用,對所有的人:

id | post_name # <= column name in first query 
1 | "my post" 

UNION 

id | post_title # <= column name is different, but type is compatible, so UNION succeeds 
1 | "my post title" 

UNION 

id | post_excerpt # <= ditto 
1 | "my post excerpt" 

會導致:

id | post_name # <= column name from first query 
1 | "my post" 
1 | "my post title" 
1 | "my post excerpt" 

這是你是什麼經歷。

相反,你可以這樣做:

id | post_name | post_title | post_excerpt 
1 | "my post" | null  | null  # <= deliberately select nulls for these columns in this query 

UNION 

id | post_name | post_title  | post_excerpt 
1 | null  | "my post title" | null 

UNION 

id | post_name | post_title | post_excerpt 
1 | null  | null  | "my post excerpt" 

這將使你類似的結果:

id | post_name | post_title  | post_excerpt 
1 | "my post" | null   | null 
1 | null  | "my post title" | null 
1 | null  | null   | "my post excerpt" 

隨着你的表中,這是一個非常基本的版本可能看起來像:

SELECT ID, post_name, null AS post_title, null AS post_excerpt FROM tps_3_posts 

UNION 

SELECT ID, null AS post_name, post_title, null AS post_excerpt FROM tps_3_posts 

UNION 

SELECT ID, null AS post_name, null AS post_title, post_excerpt FROM tps_3_posts 

這可能更適用於您正在嘗試做的事情。 Here's a SQLFiddle如果你想看到它的行動。

+0

我想我明白你的建議。我應該在每個查詢中選擇所有4列,但強制某些列爲空?這可能看起來像一個愚蠢的問題,但你如何故意爲某些列選擇空值而不是其他值? – 2015-04-01 16:31:36

+0

@MichaelEcklund查看我的基本查詢示例的更新答案。 – 2015-04-01 16:38:43

+0

非常感謝Paul。那正是我需要做的。順便說一句,W3Schools教我做'SELECT column_name AS alias_name',並演示'SELECT alias_name AS column_name'。你的語法是** CORRECT **,而W3Schools的語法是**錯誤**。當我使用W3School的方式時,MySQL會爲無效的語法拋出錯誤。用你的方式,它完美地工作。 – 2015-04-01 17:10:29

0

正如我在第二種情況下所理解的那樣,問題是隻有匹配的列應該有值,而其他的應該爲空。對於這種情況,您可以在SELECT中使用IF/ELSE或WHEN語句。這個想法是你選擇的實際值是該列對應於期望值的值,否則爲null。

另一個可能的解決方案是你可以編寫例如

SELECT `ID`, `post_name`, `post_title`, 'post_excerpt' 

因此,您選擇WHERE語句中條件的字符串值,稍後可以使用該值來了解該行屬於哪個屬性。