私は2つのテーブルを持っていますreason
:user
reason (id, reason)
user (id, name, reason_id)
データ内:
reason (1, 'ok'), (2, 'no problem')
user (1, 'eko', '1,2')
次のようなビューが必要です。
id | name | reason
1 | eko | ok, no problem
それはおそらくそれをすることですか?
select u.id,u.name,r.reason
from user u left join reason r
on u.reason_id = r.id;
この解決策を試してください:
SELECT
a.id,
a.name,
GROUP_CONCAT(b.reason ORDER BY b.id SEPARATOR ', ') AS reason
FROM
user a
INNER JOIN
reason b ON SUBSTRING(a.reason, FIND_IN_SET(b.id, a.reason) + (FIND_IN_SET(b.id, a.reason) - 1), 1) = b.id
GROUP BY
a.id
補足として、あなたが持っているのはひどいデータベース設計です。users
との関係reasons
は、N:M (多対多) の関係です。1 人のユーザーにはさまざまな理由があります。多くのユーザーが 1 つの理由を持っている可能性があります...
この関係をモデル化する最善の方法は、 と の一意の組み合わせを格納する相互参照テーブルを使用することuserid
ですreasonid
。
+-------------+ +-------------------+ +---------------+
| users | | users_has_reasons | | reasons |
+-------------+ +-------------------+ +---------------+
| userid [PK] | | userid [PK] | | reasonid [PK] |
| name | | reasonid [PK] | | reason |
| etc... | +-------------------+ | etc... |
+-------------+ +---------------+
次に、同じ結果を得るには、次のようにします。
SELECT
a.userid,
a.name,
GROUP_CONCAT(c.reason ORDER BY c.reasonid SEPARATOR ', ') AS reason
FROM
users a
INNER JOIN
users_has_reasons b ON a.userid = b.userid
INNER JOIN
reasons c ON b.reasonid = c.reasonid
GROUP BY
a.userid
結合がインデックス上で行われるため、これははるかに効率的であり、管理もはるかに簡単です (つまり、挿入、更新、削除など)。