1

以前に投稿された他の人に似た問題がありますが、それらの解決策は実際にはうまくいかないようです。

私がやろうとしているのは、特定のユーザー (別のデータベースで見つかった) に関連する 1 つのデータベースから行を選択し、次に関連付けられている添付ファイルを取得する 3 番目のデータベースから行を選択することです。

  • TABLE users(これから取得するのは id だけです)
  • TABLE membership(staff_id と group_id が必要です)
  • TABLE msg_group(id、starts、expires、および message は、私が関心を持っているものです)
  • TABLE msg_attach(id、ident、type、file はここから必要なものです)

それで。私はこのクエリを持っています:

SELECT msg_group.message, msg_group.starts, 
       msg_group.expires, 
       GROUP_CONCAT(msg_attach.file SEPARATOR ',')
FROM `membership`
INNER JOIN `msg_group` 
       ON membership.group_id = msg_group.group_id 
LEFT JOIN `msg_attach` 
       ON msg_group.id = msg_attach.ident AND msg_attach.type = "1"
WHERE membership.staff_id = "1"
AND msg_group.starts <= CURRENT_TIMESTAMP 
AND msg_group.expires >= CURRENT_TIMESTAMP 
ORDER BY msg_group.expires ASC LIMIT 0, 30

問題は、5 行が返されることです。msg_attach.file 列に「file.jpg,file2.jpg」が含まれている必要があります。これで問題ありませんが、その下に msg_attach 列が NULL の行がさらに 4 行必要です。

これに対抗するために、IFNULL(msg_attach.file, 'null') を使用してみましたが、これが返すのはまだ 1 行ですが、file.jpg、file2.jpg、null、null、null、null です。

私が望むのは、行の魔女の添付ファイルがfile.jpg、file2.jpgであり、さらに4行がその列で「null」になることです。

私はこれを十分に説明したことを願っています!#

ご協力ありがとうございます。アレックス

編集: サンプル テーブルとデータ。

msg_group:

------------------------------------------------------------
| id | group_id | message               | starts | expires |
| 1  |   1      | PIES                  | date 1 | date 2  |
| 2  |   1      | CAKES                 | date 1 | date 2  |
| 3  |   1      | BEERS                 | date 1 | date 2  |
| 4  |   1      | POMMEGRANITES         | date 1 | date 2  |
------------------------------------------------------------

msg_attach:

---------------------------------
| id | type | ident| file       |
| 1  |  1   |  3   | corona.jpg |
| 2  |  1   |  3   | peroni.png |
---------------------------------

したがって、クエリに次のように返してもらいたいと思います。

------------------------------------------------------------
| message       | starts | expires | file                  |
| PIES          | date1  | date2   | null                  |
| CAKES         | date1  | date2   | null                  |
| BEERS         | date1  | date2   | corona.jpg,peroni.png |
| POMMEGRANITES | date1  | date2   | null                  |
------------------------------------------------------------

私が得るものは次のとおりです。

------------------------------------------------------------
| message       | starts | expires | file                  |
| BEERS         | date1  | date2   | corona.jpg,peroni.png |
------------------------------------------------------------

または ISNULL を使用して:

------------------------------------------------------------------------------
| message       | starts | expires | file                                    |
| BEERS         | date1  | date2   | null, corona.jpg,peroni.png, null, null |
------------------------------------------------------------------------------

これはすべて、問題に関連していないと/思う/メンバーシップとユーザーのものを省略しています。GROUP_CONCAT (つまり、msg_attach.file のみ) がなければ、ファイルが個別にリストされた BEERS の場合は 2 つだけで、5 つの行が返されます。

4

1 に答える 1

1

単純化されたクエリは次のようになります。

SELECT  a.message, a.starts, a.expires,
        GROUP_CONCAT(b.file) fileList
FROM    msg_group a
        LEFT JOIN msg_attach b
            ON a.group_ID = b.type AND
                a.id = b.ident
GROUP   BY a.message, a.starts, a.expires

編集:これに完全なコメントをする方法がわからないため、Bogomipによる:

ありがとう、ユーザーなどを組み込むためにいくつかの変更を加える必要がありましたが、これで機能するようになりました:)

SELECT  msg_group.message, msg_group.starts, msg_group.expires, GROUP_CONCAT(msg_attach.file) attachments
FROM    msg_group
INNER JOIN membership ON membership.group_id = msg_group.group_id 
LEFT JOIN msg_attach ON msg_group.id = msg_attach.ident AND msg_attach.type = "1"
WHERE membership.staff_id = "1"
AND msg_group.starts <= CURRENT_TIMESTAMP 
AND msg_group.expires >= CURRENT_TIMESTAMP 
GROUP   BY msg_group.expires, msg_group.starts, msg_group.message
ORDER BY msg_group.expires ASC LIMIT 0, 30
于 2013-02-03T14:00:45.067 に答える