2012-03-08 156 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

相关问题