1

私は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

それはおそらくそれをすることですか?

4

2 に答える 2

0
select u.id,u.name,r.reason 
from user u left join reason r 
on u.reason_id = r.id;
于 2012-07-06T07:41:59.547 に答える
0

この解決策を試してください:

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

結合がインデックス上で行われるため、これははるかに効率的であり、管理もはるかに簡単です (つまり、挿入、更新、削除など)。

于 2012-07-06T07:56:28.313 に答える