1

本当の問題

関連するテーブルとその列

accounts      [id,name]
rooms         [id,name,topic,owner]
room_admins   [account_id,room_id]

Q: すべてのルームを管理者 ID と所有者 ID とともに取得します。

もちろん、「すべて」には条件があります (上記: WHERE name LIKE ...)。管理者と所有者は、「管理者」と呼ばれる 1 つの列に返される必要があります。上記を1つの文字列に連結しようとしました。

私が試したこと

私は解決策を思いつきましたが、外側の SELECT ごとに変化するさまざまな外部変数 ":room_id" を使用する必要があるため、まったく意味がありません。

SELECT id,name,topic,
(SELECT GROUP_CONCAT(admins.account_id) AS owner
        FROM
        (SELECT account_id
        FROM `room_admins`
        WHERE room_id=:room_id
        UNION
        SELECT owner FROM `rooms` WHERE id=:room_id) admins) AS owner
FROM `rooms`
WHERE name LIKE "%htm%" OR topic LIKE "%htm%" LIMIT 20
4

2 に答える 2

0

ほとんどの場合、依存データを選択して表示する場合は、JOIN を使用します。この場合、管理者と一緒にルームに参加する必要があるため、基本的には次のようになります。

SELECT r.id, r.name, r.topic, a.id
FROM rooms r
LEFT JOIN admins a
ON r.id = a.room_id
WHERE :condition

admins テーブルにない追加の管理者 (ルーム所有者) が 1 人いるため、2 回目に (自己) 参加する必要があります。

SELECT r.id, r.name, r.topic, a.id
FROM rooms r
LEFT JOIN admins a
ON r.id = a.room_id
LEFT JOIN rooms o
ON r.id = o.id
WHERE :condition

これは新しい情報を提供しませんが、あなたの質問は、単一のフィールドで管理者のリストを返したいと述べています. 最後に、すべてをまとめると、次のようになります。

SELECT r.id, r.name, r.topic, GROUP_CONCAT(a.id)
FROM rooms r
LEFT JOIN 
(
  SELECT id, room_id FROM admins
  UNION SELECT room.owner AS id, rooms.id AS room_id FROM rooms
) a
ON r.id = a.room_id
WHERE :condition
GROUP BY r.id

しかし、この醜い sub-select-union 句を避けるために、ルーム所有者も管理テーブルに入れることをお勧めします。

于 2013-09-10T15:08:58.113 に答える
0

まあ、私はこれを深く考えていません...しかし、私はこれを思いつきました(サンプルデータはテストを行うのに役立ちました...したがって、これは盲目的な答えです)。

select id, name, topic, group_concat(owner_admin) from (
    select id, name, topic, owner owner_admin from rooms
    union
    select id, name, topic, account_id from rooms
    left join room_admins on id = room_id
) s
where name like "%htm%" or topic like "%htm%"
group by id, name, topic

基本的に、所有者と管理者が 1 つの列に混在する派生テーブルを生成しているだけです。次に、その混合列でグループ化を実行します。

于 2013-09-10T15:04:35.500 に答える