0

効率的な方法で出席表を印刷できません。おそらくこれを行うための用語がありますが、それが何であるかがわからないので、解決策を探すのに苦労しています. ピボット テーブルは近いですが、十分ではありません。

次のようにレイアウトされたMySQLデータベースがあります(簡略化):

Log_events(event_id, event_name, ...)
Log_members(member_id, member_name, ...)
Log_attendance(member_id, event_id, ...)

Log_events にはイベントのすべてのデータがあり、Log_members には各メンバーのすべてのデータがあり、Log_attendance にはメンバーがイベントに参加するたびに 2 つの ID エントリがあります。

すべてのイベントを列として、次にすべてのメンバーを行として持つテーブル (PHP を使用した HTML テーブル) を印刷しようとしています。次に、log_attendance テーブルを使用して、メンバーがイベントに参加した各テーブル セルに、次のような目盛りまたは情報を出力します。

名前 | イベント1 | イベント2 | イベント3
----------------------------------
メンバー1 | X | X | バツ
メンバー2 | | | X |
メンバー3 | X | | | バツ

途方もない量のネストされたクエリなしでこれを行う方法を理解するのに苦労しています。これを効率的に行うにはどうすればよいですか?

これは私が印刷しようとしている親切なものの例です: http://www.worldoflogs.com/guilds/30890/character/

4

2 に答える 2

0

私はそれを機能させることができました。Clockwork-Muse が投稿したリンクから、MySQL 関数 GROUP_CONCAT を見つけました。

私のクエリは次のようになります。

SELECT a.member_id, p.member_name, c.* 

FROM Log_attendance a NATURAL JOIN Log_events r NATURAL JOIN Log_players p 

LEFT JOIN (
        SELECT a2.member_id pid, GROUP_CONCAT(a2.event_id) all_events 
        FROM Log_attendance a2
    ) c ON c.pid=a.member_id 

GROUP BY a.member_id

(エラーがある場合は、手動で少し編集しなければならなかったためです)

基本的に、メンバーごとにすべてのイベント ID を「1,2,3,5,9」のような文字列に連結します。PHP では、最初にすべてのイベントを取得し、列を出力して、メンバーごとにこのリスト文字列を列の ID と比較します。結果のサイズを制限するために、他のWHEREステートメントがあり、遅くなりすぎないようにしています。

于 2013-05-29T19:59:58.387 に答える