1

次の 2 つのビューを結合するにはどうすればよいですか? 私は自分で試しましたが、常に壊れて、繰り返しデータが表示されます。私が考えることができる唯一の回避策は、2 つのビューを作成し、次に 3 つ目のビューを作成して 2 つのビューを結合することでした。問題は、私のアプリケーションでは約 10 個のビューがあり、効率的でもなく、正しく設計されていないことです。

ビュー 1

SELECT e.id, e.name, GROUP_CONCAT(email SEPARATOR ', ') AS array_emails
FROM entity AS e
LEFT JOIN emails ON e.id=emails.entity_id
GROUP BY id; 

ビュー 2

SELECT e.id, e.name, GROUP_CONCAT(web_site SEPARATOR ', ') AS array_web_sites
FROM entity AS e
LEFT JOIN web_sites ON e.id=web_sites.entity_id
GROUP BY id 

ビュー 3 (このビューはビュー 1 と 2 を結合します)

SELECT e.id, e.name, view_web_sites.array_web_sites, view_emails.array_emails
FROM entity AS e
LEFT JOIN view_web_sites ON e.id=view_web_sites.id
LEFT JOIN view_emails ON e.id=view_emails.id
GROUP BY id

これは私の最初の見解であり、正しく機能しませんでした。値が繰り返されます。

オリジナル - 壊れたビュー SELECT e.id, e.name, GROUP_CONCAT(email SEPARATOR ',') AS email, GROUP_CONCAT(web_site SEPARATOR ',') AS web_sites FROM entity AS LEFT JOIN email ON e.id=emails.entity_id LEFT e.id=web_sites.entity_id GROUP BY id; で web_sites に参加します。

編集: select ステートメントの個別の引数を既に調査しましたが、これはうまく機能します。ただし、あるテーブルにはバイナリ列があり、個別の引数が値を「消去」し、列を役に立たなくします。この問題に関する提案はありますか?

編集#2(修正):同様の問題に直面している可能性のある人のために、問題を解決することができました.

SELECT entity.id, entity.name,
(SELECT GROUP_CONCAT(emails.email) FROM emails WHERE entity.id=emails.entity_id) AS emails_array,
(SELECT GROUP_CONCAT(web_sites.web_site) FROM web_sites WHERE
entity.id=web_sites.entity_id) AS websites_array
FROM entity
ORDER BY id 
4

1 に答える 1

0
SELECT e.id, 
       e.name, 
       GROUP_CONCAT(DISTINCT m.email SEPARATOR ', ') AS array_emails,
       GROUP_CONCAT(DISTINCT w.web_site SEPARATOR ', ') AS array_web_sites
FROM entity AS e
  LEFT JOIN emails AS m ON e.id = m.entity_id
  LEFT JOIN web_sites AS w ON e.id = w.entity_id
GROUP by e.id ; 

ビューを使用する場合、最後の は必要ありませんGROUP BY id:

SELECT e.id, 
       e.name, 
       m.array_emails,
       w.array_web_sites
FROM entity AS e
  LEFT JOIN view_emails AS m ON e.id = m.entity_id
  LEFT JOIN view_web_sites AS w ON e.id = w.entity_id ; 

ネストされたビューが必要ない場合は、1 つのクエリを使用して記述し、派生テーブル内の結合を削除して単純化できます。

SELECT e.id, 
       e.name, 
       m.array_emails,
       w.array_web_sites
FROM entity AS e
  LEFT JOIN 
    ( SELECT entity_id, 
             GROUP_CONCAT(email SEPARATOR ', ') AS array_emails
      FROM emails
      GROUP BY entity_id 
    ) AS m ON e.id = m.entity_id
  LEFT JOIN 
    ( SELECT entity_id, 
             GROUP_CONCAT(web_site SEPARATOR ', ') AS array_web_sites
      FROM web_sites
      GROUP BY entity_id 
    ) AS w ON e.id = w.entity_id ;
于 2013-10-19T18:46:01.543 に答える