2012-03-08 23 views
1

実行しようとしているクエリに問題があります。クエリは3つの別々の選択クエリを取得しますが(各クエリはそれ自身で動作します)、すべてを1つの結果に連結することに固執しています。 2つの選択肢には同じフィールドが含まれていますが、3番目のフィールドには異なるフィールドが含まれています。クエリを2つの別々のフィールドに分割するのではなく、分でそれは私にエラー1241を与えています。異なるフィールド名を持つSQLの複数選択クエリ?

私は1番目と3番目のSELECT文を結合するとうまく動作しますが、明らかに中間のクエリには異なるフィールド名とデータが出てきます。あなたが配列の配列に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` 

EDIT:

これは私が最後に働いてしまったコードでは、完全な外部結合の回避策を利用しました。おそらく、過剰なものですが、私が必要とするすべてのデータを取得するために1回だけのデータベースのトリップを保証します。 LEFT_OUTER_JOINとRIGHT_OUTER_JOINがいる限り、彼らが一致しないことが保証されているとして何もすることができます。:

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

また、これらのフィールドを空の値で偽装することもできますが、これにより、必要なものが得られない可能性があります。私が何を言及しているか説明する:3列の表と結合する2列の表がある場合、その列には一定の値を使用します。同様に:SELECT id、name、 'value'テーブルからの年齢 – Gimmy

答えて

-1

おそらく

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' 

UNIONキーワードを使用したいと思うこれは、列がすべてであると仮定しています同じ種類。 2番目の列にはいくつかの異なるフィールドが含まれているかのように見えます。

+0

ええと2番目の列は類似しているが異なるデータを引き出していますが、Mongoのように配列の配列に結果を格納する方法があるかどうかはわかりませんでした。 –

0

2番目のクエリに異なるフィールドがあるため、UNIONは実行しません。これらを他の列の横に置く必要があります。私はこのルールを念頭に置いています.... UNIONは他のデータの上にデータを置きます。 JOINはデータを他のデータの隣に置きます。

だから私はあなたが終わりたいと思うのは、最初と最後のクエリの列と、中間クエリの列を両方の結果セットの最後に貼り付けたものです。

私は最初と最後のクエリを結合し、その結果セットを2番目のクエリにemployer_hashで結合します。私はUNION ALLを使用しているので、レコード数が意味をなさない(つまり、query1 + query2 =新しいクエリー)が、あなたの望むものではないかもしれません。

また、左外部結合を実行するので、2番目のクエリで結果セットに表示されるレコードが決まりません。これには微調整が必​​要な場合がありますが、どこに行きたいかを知る必要があります。

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

Hey Jody、提案をいただきありがとうございます。私はあなたのコードをちょっと微調整していたので、うまくいきました。私は(Googleの周りを見た後)私は完全な外部結合の後、私は1データベースの旅行ですべての情報を得ることができたと思うが、そこに完全な外部の結合はありません!おそらく2つのデータベースクエリを試してみて、すべてを1に収めるのが最も安全だと思います! –

関連する問題