2

メーリング リストに使用する MySQL データベースがあり、データを抽出する必要があるため、1 つのメンバー レコードが 1 つの行で表されます。メーリング リストは、ユーザー属性を EAV として保存します。次の SQL クエリを使用して必要なすべての詳細を抽出できますが、各メンバー レコードは複数の行を占有します。

SELECT a.id, a.name, a.email, b.id, b.name, b.email, c.title, d.val
FROM lists a, listmembers b, fields c, fieldsdata d
WHERE a.id = b.nl
AND b.id = d.eid
AND c.id = d.fid
ORDER BY b.id, a.id, b.name

これは次のようなものを返します。

'6', 'Mailing List name', 'owner@mailinglist.com', '10478', 'username', 'mailinglistmember@emailaddress.com', 'Firstname', 'John'
'6', 'Mailing List name', 'owner@mailinglist.com', '10478', 'username', 'mailinglistmember@emailaddress.com', 'Lastname', 'Smith'
'6', 'Mailing List name', 'owner@mailinglist.com', '10478', 'username', 'mailinglistmember@emailaddress.com', 'Country', 'UK'
'6', 'Mailing List name', 'owner@mailinglist.com', '10478', 'username', 'mailinglistmember@emailaddress.com', 'Town', 'Cambridge'
'6', 'Mailing List name', 'owner@mailinglist.com', '10478', 'username', 'mailinglistmember@emailaddress.com', 'Shoesize', '7'
'6', 'Mailing List name', 'owner@mailinglist.com', '10478', 'username', 'mailinglistmember@emailaddress.com', 'Favourite Colour', 'Purple'

SQL を使用してこれを 1 つの行にフラット化する必要があります。キーの名、姓、町、および国に関連する値のみが必要です。

データベースはそれほど大きくなく、fieldsdata テーブルが最大で約 5500 行あります。

本当の苦痛のように思えるので、どんな指摘もありがたく受け取るだろう. !

4

3 に答える 3

3

クエリが MySQL ではなく SQL Server に関連するこの質問を見つけた人 (私のような) には、ピボット クエリのオプションがあります。

SELECT id, name, email, id2, name2, email2, [Firstname], [Lastname], 
    [Country], [Town]
FROM (select id, name, email, id2, name2, email2, title, val from yourresults) ps
PIVOT (
        MAX(val) 
        FOR title IN ([Firstname], [Lastname], [Country], [Town])
    ) as pvt

SQLフィドルを参照してください(上記のsgeddes SQLフィドルから作業-ありがとう)

またはMS Accessで:

TRANSFORM Max(val)
SELECT id, name, email, id2, name2, email2
FROM yourresults
GROUP BY id, name, .email, id2, name2, email2
PIVOT title In ("FirstName","LastName","Country","Town");
于 2014-03-27T01:01:29.630 に答える
2

あなたの質問を正しく理解していれば、MAXwithを使用して結果をピボットできます。CASE

SELECT l.id, l.name, l.email, lm.id, lm.name, lm.email, 
   MAX(CASE WHEN f.title = 'Firstname' THEN fd.val END) FirstName,
   MAX(CASE WHEN f.title = 'Lastname' THEN fd.val END) Lastname,
   MAX(CASE WHEN f.title = 'Country' THEN fd.val END) Country,
   MAX(CASE WHEN f.title = 'Town' THEN fd.val END) Town
FROM lists l
   JOIN listmembers lm ON l.id=lm.nl
   JOIN fieldsdata fd ON fd.eid = lm.id
   JOIN fields f ON f.id = fd.fid 
GROUP BY l.id, lm.id

これは、リスト テーブルの id フィールドが一意の識別子であると想定しています。そうでない場合は、GROUP BY にフィールドを追加する必要があります (ほとんどの場合、listmembers テーブルの id フィールド)。

于 2013-05-30T15:33:11.887 に答える