2012-03-08 49 views
1

我遇到了一個我試圖運行的查詢的問題。該查詢獲取3個獨立的select查詢(每個查詢都可以自己工作),但是我將它們全部拼接成單個結果。其中2個選項包含相同的字段,但第3個包含不同的字段,我想知道是否有任何我可以做的事情,而不是將查詢拆分成2個單獨的字段。在這一分鐘,它給了我錯誤1241.具有不同字段名稱的SQL多選查詢?

它工作正常,當我結合第一和​​第三選擇語句在一起,但顯然中間查詢有不同的字段名稱和數據出來。只是不確定是否可以將sql數據提取到數組中,會更容易!

歡呼聲,安德魯

SELECT( 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email`, `cas_users`.`meta`, `cas_users`.`id` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '0' 
    AND `cas_users`.`expiry` > '1331165519' 
) AS `c_p`, ( 
    SELECT `name`, `email`, `phone`, `invited` 
    FROM `cas_not_connected` 
    WHERE `employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
) AS `nc`, ( 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email`, `cas_users`.`meta`, `cas_users`.`id` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '1' 
    AND `cas_users`.`expiry` < '1331165519' 
) AS `c_e` 

編輯:

這是我得到了最終使用的代碼,採取了全外的優勢加入解決方法。也許矯枉過正,但確保只有1個數據庫旅程來獲取我需要的所有數據。只要他們保證不匹配:

SELECT * FROM ( 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email` AS `email1`, `cas_users`.`meta`, `cas_users`.`id` AS `id1`, `cas_connected`.`stage` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '0' 
    AND `cas_users`.`expiry` > '1331173687' 
    UNION 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email` AS `email1`, `cas_users`.`meta`, `cas_users`.`id` AS `id1`, `cas_connected`.`stage` FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '1' 
    AND `cas_users`.`expiry` < '1331173687') 
AS `conn` 
LEFT OUTER JOIN `cas_not_connected` 
ON `conn`.`id1` = `cas_not_connected`.`name` 
UNION 
SELECT * FROM ( 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email` AS `email1`, `cas_users`.`meta`, `cas_users`.`id` AS `id1`, `cas_connected`.`stage` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '0' 
    AND `cas_users`.`expiry` > '1331173687' 
    UNION 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email` AS `email1`, `cas_users`.`meta`, `cas_users`.`id` AS `id1`, `cas_connected`.`stage` FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '1' 
    AND `cas_users`.`expiry` < '1331173687') 
AS `conn` 
RIGHT OUTER JOIN `cas_not_connected` 
ON `conn`.`id1` = `cas_not_connected`.`name` 
+0

你也可以僞造那些空值的字段,但這很可能不會給你你想要的。解釋我的看法:如果你有一個兩列表,你想與三列表結合使用該列的常數值。像:SELECT id,name,'value'AS表的年齡 – Gimmy 2013-07-07 15:48:58

回答

-1

您可能需要使用UNION關鍵字

SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email`, `cas_users`.`meta`, `cas_users`.`id` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '0' 
    AND `cas_users`.`expiry` > '1331165519' 
UNION 
    SELECT `name`, `email`, `phone`, `invited` 
    FROM `cas_not_connected` 
    WHERE `employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
UNION 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email`, `cas_users`.`meta`, `cas_users`.`id` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '1' 
    AND `cas_users`.`expiry` < '1331165519' 

這假設列所有的LEFT_OUTER_JOIN和RIGHT_OUTER_JOIN可以是任何東西相同的類型。看起來好像第二列包含一些不同的字段。

+0

是的,第二列是拉相似但不同的數據,我不確定是否有方法將結果存儲在數組中,就像Mongo一樣。 – 2012-03-08 00:54:13

0

由於您在第二個查詢中有不同的字段,UNION不會這樣做。你必須把這些放在其他列旁邊。我記住這條規則...... UNION將數據放在其他數據之上。 JOIN將數據放在其他數據旁邊。

所以我想你最終想要的是來自第一個和最後一個查詢的列以及來自中間查詢的列添加到這兩個結果集的結尾。

因此,我將第一個和最後一個查詢聯合在一起,然後通過employer_hash將該結果集加入到第二個查詢中。我正在使用UNION ALL,以便記錄數有意義(即query1 + query2 = new query),儘管這可能不是您想要的。

也做一個左外部聯接,所以第二個查詢並不指示哪些記錄出現在結果集中。這可能需要一些微調,但應該讓你到你想去的地方。

SELECT * FROM ( 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email`, `cas_users`.`meta`, `cas_users`.`id`, employer_hash 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '0' 
    AND `cas_users`.`expiry` > '1331165519' 
UNION ALL 
    SELECT CONCAT_WS(' ', `cas_users`.`first_name`, `cas_users`.`last_name`) AS `name`, `cas_users`.`email`, `cas_users`.`meta`, `cas_users`.`id` 
    FROM `cas_users` 
    INNER JOIN `cas_connected` 
    ON `cas_connected`.`freelancer_hash` = `cas_users`.`hash` 
    WHERE `cas_connected`.`employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
    AND `cas_connected`.`stage` = '1' 
    AND `cas_users`.`expiry` < '1331165519' 
) AS `c_p_c_e` 
LEFT OUTER JOIN ( 
    SELECT `name`, `email`, `phone`, `invited`, employer_hash 
    FROM `cas_not_connected` 
    WHERE `employer_hash` = 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35' 
) AS `nc`, on c_p.employer_hash = nc.employer_hash 
+1

嗨喬迪,感謝您的建議,我調整了一下你的代碼,所以它工作,但唉,不是我以後。我認爲(在環顧了谷歌之後),我完成了一個完整的外部聯接,這樣我可以在1個數據庫中獲取所有信息,但是在mysql中沒有完整的外部聯接!我認爲獲得2個數據庫查詢可能最安全,而不是嘗試將所有內容都合併到1中! – 2012-03-08 01:52:36

相關問題