0

これが私がやりたいことです:私は次のテーブルを持っています:

User
id     name  
1      user1


Emails
id     email                           user_id
1      something@somewhere.com         1
2      something_else@somewhere.com    1

Addresses
id    address  user_id
 1    Here     1
 2    There    1

私がやりたいのは、ユーザーが持っている電子メールとアドレスの数に関係なく、ユーザーごとに 1 つの行のみを含む SELECT です。問題は、1 つのアドレスを表示する必要があることです。したがって、結果が次のようになる必要があります。

name         email                address  total_emails total_addresses
user1        something@somewhere  Here     2            2

GROUP BYを考えたのですが、COUNT関数を使ってメールやアドレスの数を取得しているため、やむを得ずすべての列をGROUP BYして組み合わせごとに結果を出してしまいます...

私がやりたいことはSQLでも可能ですか? CodeIgniter ActiveRecord を使用することは可能ですか?

4

2 に答える 2

0
;With user_details AS
(
SELECT
name
,_Addresses.address
,_email.email
,row_number() OVER (PARTITION BY name ORDER BY _email.id ASC) AS email_row
,COUNT(_email.email) OVER (PARTITION BY name) AS email_count
,row_number() OVER (PARTITION BY name ORDER BY _addresses.id ASC) AS address_row
,COUNT(_addresses.address) OVER (PARTITION BY name) AS address_count
FROM _user
LEFT OUTER JOIN _email on _email.user_id = _user.id
LEFT OUTER JOIN _Addresses ON _Addresses.user_id = _user.id
)
SELECT 
name
,MAX(CASE WHEN email_row = 1 THEN email END) AS email
,MAX(CASE WHEN address_row = 1 THEN address END) AS address
,MAX(email_count) as total_emails
,MAX(address_count) as total_addresses
FROM user_details
GROUP BY name
于 2012-08-13T14:52:52.133 に答える
0

私はSQLサーバーに精通していませんが、mysqlでは次のように書きます:

SELECT t1.id AS user_id, 
       t2.email AS user_email,
       t3.address AS user_address,
       (SELECT count(*) from emails WHERE user_id = t1.id) as total_emails,
       (SELECT count(*) from emails WHERE user_id = t1.id) as total_addresses,
FROM user t1
LEFT JOIN emails t2 on t1.id = t2.user_id
LEFT JOIN addresses t3 ON t1.id = t3.user_id
GROUP BY t1.id

SQLサーバーがサブクエリをサポートしている場合、それは機能するはずです

于 2012-08-13T14:40:07.287 に答える