0

私は表に出なければなりません、contactsそしてgroups
内部contactsには 3 つの列があります:id first_name last_last
内部groupsには 2 つの列があります:id linked

連絡先をグループに分けたい。したがって、連絡先をグループに追加すると、その連絡先 ID が、linked列内のコンマで区切られた連絡先 ID のリストに追加されるのが最善の方法だと思いました。

したがって、連絡先 1、4、14、および 24 を特定のグループに追加した場合、linked列にはこの値が含まれます1,4,14,24

次に、そのグループの連絡先を表示したいと思います。そのexplode()ため、linked値を取得し、a を使用してforeach()展開された配列を循環し、各ループで MySQL からその連絡先の名と姓を選択して表示します。

それはすべてうまくいきます。私の問題は、そのグループに表示されている連絡先を並べ替えたいと思ったことです。ただし、グループに配置された順序で表示されます。

foreach()名の昇順または降順で並べ替えられるようにしたいのですが、各連絡先を選択してエコーしているため、方法がわかりません。

PS と呼ばれる連絡先に列を作成しgroups、グループ内のすべての連絡先を保存したのと同じ方法で、連絡先が含まれるすべてのグループを保存すると思いました。したがって、連絡先がグループ 1、2、4、および 6 にある場合、その連絡先groups列の値は になり1,2,4,6ます。唯一の問題は、グループ 6 のすべての連絡先を検索しているとしましょう。MySQL ステートメントでそのリストを検索するにはどうすればよいでしょうか? 最善の方法だと思いましたSELECT first_name FROM contacts WHERE groups LIKE '%6%'が、連絡先がグループ 60 にある場合はどうなりますか? 正しいグループに属していなくても、その連絡先も選択されませんか?

4

1 に答える 1

1

データベースの同じフィールドに複数の値を保存しないでください。これまで見てきたように、各値を個別に処理する場合は問題が発生します。

あなたの場合、その人が属するグループごとに、groupsテーブルに1つの行を挿入します。2つのテーブルを結合して、必要な方法で情報を取得します。

例:サンタクロースが所属するグループを見つけるには:

SELECT groups.id 
FROM contacts
INNER JOIN groups 
ON groups.linked = contacts.id
WHERE firstname = 'Santa' AND lastname = 'Claus'

または、グループ1に含まれるユーザーを検索します。

SELECT firstname, lastname 
FROM contacts
INNER JOIN groups
ON groups.linked = contacts.id
WHERE groups.id = 1
ORDER BY lastname, firstname

GROUP_CONCAT結果をコンマ区切りのリストとして取得するには、次の関数を使用できます。

SELECT groups.id,
       GROUP_CONCAT(firstname, ' ', lastname
                    ORDER BY lastname SEPARATOR ', ') AS groups 
FROM contacts
INNER JOIN groups
ON groups.linked = contacts.id
GROUP BY groups.id

グループ名を保存するには、3つのテーブルを使用すると便利な場合があります

連絡先(id、firstname、lastname)

グループ(id、groupname)

Group_membership(contact_id、group_id)

于 2013-03-15T08:38:20.667 に答える