2012-04-24 10 views
6

私は奇妙なSQLテーブル(鉱山ではありません)を持っています。その中には、特に以下のフィールドがあります。last_name, primary_name, secondary_name、夫婦を表しています。最後の名前は共有されているものとみなされます(それほどモダンではありません)。カップルでない場合、primary_nameまたはsecondary_nameのいずれかがNULLになることがあります。 (テーブルにもいくつかの重複があります)SQLクエリをすべての行で2つの一致にすることはできますか?

私がしたいことは、通常の方法でアルファベット順にデータベースのすべての名前(「最初の最後」)のリストを取得することです。今、私はPHPを使用してデータベースを介して2つのパスを行うと、PDOてる:

$qstr = "SELECT DISTINCT primary_name, last_name 
      FROM members 
      WHERE primary_name IS NOT null 
      ORDER BY last_name, primary_name"; 
$sth = $dbh->prepare($qstr); 
$sth->execute(); 
// output the results 

$qstr = "SELECT DISTINCT secondary_name, last_name 
      FROM members 
      WHERE secondary_name IS NOT null 
      ORDER BY last_name, secondary_name"; 
$sth = $dbh->prepare($qstr); 
$sth->execute(); 
// output the new results 

しかし、第二のパスが再びやり直すため、最終結果はアルファベット順ではありません。

すべての名前を一度にアルファベット順に取得するにはどうすればよいですか? SQLでこれを行う方法はありますか?それとも2つの配列を作成し、後でPHPでそれらをアルファベット順に並べ替える必要がありますか?データベースは、このようなものになります

EDIT

last_name primary_name secondary_name 
---------------------------------------- 
Abrams  Joe   Susan 
Miller  Sam   Abby 

を所望の出力は、このようなものになるだろう:最初のパスは、すべての夫を取得する場合、代わりに

["Joe Abrams","Susan Abrams","Abby Miller","Sam Miller"] 

とすべての妻を二度目に渡して、私はこのような何かを得ている:

["Joe Abrams","Sam Miller","Susan Abrams","Abby Miller"] 
+0

あなたが見たい出力の例を投稿できますか(4つまたは5つの異なる名前の組み合わせを使用しています)?それを解読するために+1は –

答えて

2

代替UNIONを使用することです...

SELECT 
    * 
FROM 
(
    SELECT primary_name AS pri_sec_name, last_name 
    FROM members 
    WHERE primary_name IS NOT null 

    UNION 

    SELECT secondary_name AS pri_sec_name, last_name 
    FROM members 
    WHERE secondary_name IS NOT null 
) 
    AS data 
ORDER BY 
    last_name, pri_sec_name 

注:UNIONUNION ALLと対照的に)は、結果を重複除外します。

もう1つは、マッピングテーブルで結合を行うことです。私はあなたが必要だと思う

SELECT 
    members.last_name, 
    CASE WHEN map.mode = 1 THEN members.primary_name ELSE members.secondary_name END AS pri_sec_name 
FROM 
    members 
INNER JOIN 
    (SELECT 1 as mode UNION ALL SELECT 2 as mode) AS map 
    ON (map.mode = 1 AND members.primary_name IS NOT NULL) 
    OR (map.mode = 2 AND members.secondary_name IS NOT NULL) 
ORDER BY 
    1, 
    2 
+0

UNIONは、私が長い間使用していないために忘れてしまったものの1つです。これはうまくいくようですが、クエリのASデータ部分について私に説明することはできますか? – Blazemonger

+0

気にしないで、SQLのエラーが私のために説明しました。 – Blazemonger

+0

@Blazemonger - すべてをサブクエリにまとめてサブクエリに名前を付けるだけです。これは、サブクエリをビューとして扱うため、インラインビュー*と呼ばれることがよくあります。 'SELECT * FROM()AS MyViewName' – MatBailie

7

私が正しく理解していれば、私はあなたがこのような何かを探していると思う:

select distinct coalesce(primary_name, secondary_name) as pri_sec_name, 
    last_name 
from members 
where coalesce(primary_name, secondary_name) is not null 
order by last_name, 
    coalesce(primary_name, secondary_name) 

更新

いくつかのケースでは、あなたが両方primary_nameはLAST_NAME、のための1つの行を持っているように聞こえるし、 secondary_nameが設定されます。以下のクエリあなたが(申し訳ありませんが、COALESCEこの時間)たくない出力を与える必要があります。

select last_name, pri_sec_name 
from (
    select primary_name as pri_sec_name, last_name from members where primary_name is not null 
    union all 
    select secondary_name as pri_sec_name, last_name from members where secondary_name is not null 
) a 
order by last_name, pri_sec_name 
+1

+1です。 –

+0

+1私は合体が大好き! –

+0

初めて「合体」を聞いたことがあります。このSQLの出力はどのようになりますか?私は、(ほとんどの場合)すべてのテーブル行に対して2つの結果行が必要なときに、1つのテーブル行ごとに1つの結果行を取得しているように見えます。 – Blazemonger

2

SELECT primary_name AS name 
    , last_name 
    FROM members 
    WHERE primary_name IS NOT NULL 
UNION 
SELECT secondary_name 
    , last_name 
    FROM members 
    WHERE secondary_name IS NOT NULL 
ORDER BY last_name, name 

別の書き換えはUNION ALLを使用している:

SELECT COALESCE(primary_name, secondary_name) AS name 
    , last_name 
    FROM members 
UNION ALL 
SELECT secondary_name 
    , last_name 
    FROM members 
    WHERE primary_name IS NOT NULL 
    AND secondary_name IS NOT NULL 
ORDER BY last_name, name 

第二版が速いかもしれないが、それは重複した結果を示してもよいです。より多くの例ならば、あなたはこれらの行、SusanLeaと結婚して1と結婚して1 Joe Jacksonあります

last_name primary_name secondary_name 
---------------------------------------- 
Jackson Joe   Susan 
Jackson Joe   Lea 

を最初のクエリqouldショー:

name last_name 
----------------- 
Joe Jackson 
Lea Jackson 
Susan Jackson 

第二は、「重複」を持っているだろうが

name last_name 
----------------- 
Joe Jackson 
Joe Jackson 
Lea Jackson 
Susan Jackson 

どちらが適切ですかは、仕様によって異なります。

関連する問題