1

次のテーブル構造があると仮定します

DROP TABLE IF EXISTS `members`;

CREATE TABLE `members`
(
    m_id  INT PRIMARY KEY NOT NULL AUTO_INCREMENT
  , m_upgrade TINYINT NOT NULL DEFAULT 0  COMMENT '0 - no upgrade, 1 - possible upgrade'
) ENGINE MyISAM
;

DROP TABLE IF EXISTS `upgrade_reasons`;

CREATE TABLE `upgrade_reasons`
(
    ur_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT
  , ur_by INT NOT NULL COMMENT 'Who upgraded me'
  , ur_for INT NOT NULL COMMENT 'who this upgrade is for'
  , ur_vote TINYINT DEFAULT NULL COMMENT 'NULL - not yet voted, 0 - do not upgrade, 1 - upgrade'
  , ur_reason VARCHAR(255) DEFAULT NULL COMMENT 'The reason for marking as upgrade / do not upgrade'
  , UNIQUE INDEX ur_idx(ur_by, ur_for)
) ENGINE MyISAM
;


INSERT INTO `members`(m_id, m_upgrade)
VALUES
    (1, 0)
  , (2, 0)
  , (3, 0)
  , (4, 1)
  , (5, 1)
;

INSERT INTO `upgrade_reasons`(ur_by, ur_for, ur_vote, ur_reason)
VALUES
    (2, 4, 1, 'Vote for')
  , (3, 4, 0, 'vote against')
  , (3, 5, 0, 'vote against')
;

メンバー1については、次のような結果が見たいです。

+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| m_id | m_upgrade | ur_by | ur_for | ur_vote | ur_reason |
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| 4 | 1 | NULL | 4 | NULL | NULL |
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| 5 | 1 | NULL | 5 | NULL | NULL |
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +

メンバー2については、次のような結果が見たいです。

+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| m_id | m_upgrade | ur_by | ur_for | ur_vote | ur_reason |
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| 4 | 1 | 2 | 4 | 1 | に投票する|
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| 5 | 1 | NULL | 5 | NULL | NULL |
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +

メンバー3の場合、次のような結果が見たいです。

+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| m_id | m_upgrade | ur_by | ur_for | ur_vote | ur_reason |
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| 4 | 1 | 3 | 4 | 0 | 反対票を投じる|
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +
| 5 | 1 | 3 | 5 | 0 | 反対票を投じる|
+ ----- + ----------- + ------- + -------- + --------- + ---- --------- +

これまでのところ、どこから始めればよいかわからないため、(StackOverflowを検索する以外は)何も試していません。

NB。これはPHPでコード化されたWebサイトであるため、純粋なSQLソリューションがない場合は、PHPで実行できます。

前もって感謝します

4

1 に答える 1

0

joinsこれに使用する必要があります

select m1.m_id, m1.m_upgrade,
       ur.ur_by, coalesce(ur.ur_for, m1.m_id) as ur_for, ur.ur_vote, ur.ur_reason
from members m1
join members m2 on m2.m_id <> m1.m_id
left join upgrade_reasons ur on ur.ur_by = m2.m_id and ur.ur_for = m1.m_id
where m1.m_upgrade = 1

テスト用のSQLFiddle

于 2013-03-18T16:05:42.030 に答える