2017-01-03 14 views
2

表の作成を選択し、関連するすべてのレコードを

CREATE TABLE `users` (
    `id` INT UNSIGNED NOT NULL, 
    `name` VARCHAR(100) NOT NULL, 
    PRIMARY KEY(`id`) 
); 

CREATE TABLE `email_address` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `user_id` INT UNSIGNED NOT NULL, 
    `email_address` VARCHAR(50) NOT NULL, 
    INDEX pn_user_index(`user_id`), 
    FOREIGN KEY (`user_id`) REFERENCES users(`id`) ON DELETE CASCADE, 
    PRIMARY KEY(`id`) 
); 

データ挿入

INSERT INTO users (id, name) VALUES (1, 'Mark'), (2, 'Tom'), (3, 'Robin'); 

INSERT INTO email_address (user_id, email_address) VALUES 
(1, '[email protected]'), (1, '[email protected]'), (1, '[email protected]'), 
(2, '[email protected]'), (2, '[email protected]'), (2, '[email protected]'), 
(3, '[email protected]'), (3, '[email protected]'), (3, '[email protected]'); 

SQLクエリ

SELECT usr.name AS name 
    , (SELECT email.email_address 
      FROM email_address AS email 
     WHERE email.user_id = usr.id) AS email 
    FROM users AS usr;  

上記のMySQLクエリを使用すると、MySQLエラー 'サブクエリが1行以上を返します'を回避し、特定のユーザのすべての関連するメールアドレスを以下のように選択する方法を教えてください。ありがとう。

+----------+-------------------------------------------------+ 
| name |      email      | 
+----------+-------------------------------------------------+ 
| Mark | [email protected], [email protected], [email protected] | 
| Tom | [email protected], [email protected], [email protected]  | 
| Robin | [email protected], [email protected], [email protected] |     
+----------+----------+--------------------------------------+ 
+1

GROUP_CONCATが1 possibility-あるを使用しての、このように行いたいです私は真剣にこれがデータを返す役に立つ方法かどうか疑問に思います。 – Strawberry

答えて

-1

email_addressテーブルであいまいなsubselect文を作成しています。言い換えれば、1行の選択に対して、副選択で複数の行を選択しようとしています。それについて考えてみましょう。そして、私はあなたにこの質問をします。「データベースはあなたの質問をどの電子メールアドレスで選択するのですか?あなたのクエリでは、使用する電子メールアドレスが指定されていないため、答えはできません。したがって、あなたのエラー。

サブ選択を1値に制限することができます。ここではそれがどのように見えるかです:

SELECT usr.name AS name, 
    (SELECT email.email_address 
    FROM email_address AS email 
    WHERE email.user_id = usr.id 
    LIMIT 1) 
AS email 
FROM users AS usr; 

それでも、あなたの最良のオプションは、潜在的な電子メールのすべてを電子メールで送信することがあります。

SELECT usr.name AS name, addr.email AS email 
FROM users AS usr 
LEFT JOIN email_address AS addr ON (addr.user_id=usr.id); 

あなたのユーザーと電子メールアドレスの組み合わせである、行の選択を与える。このために、あなたはこのような何かを構築することがありますJOIN句を必要としています。つまり、複数の電子メールアドレスの関連付けを持つユーザーの場合、複数の行が返されます。つまり、返されたすべての行を繰り返し処理し、すべてのユーザーの電子メールを電子メールで送信することができました。プライマリ電子メールアドレスを特定する方法がある場合は、プライマリ電子メールアドレスに電子メールを送信するだけです。 SEPARATOR

+0

これがなぜ投票されたのか聞いてみたい。否定的な意見に対するフィードバックは、ここの皆さんにとって時間の無駄だと思われません。 – SwampDev

0

私はむしろ代わりにサブクエリ

select 
    GROUP_CONCAT(ea.email_address) as emails, 
    u.name 
    from 
    users u 
    left join email_address ea ON (u.id=ea.user_id) 
    group by u.id,u.name 
関連する問題