1

私はこのサイトとネットで一般的に見回しましたが、これまでのところ運がありません.

質問 :

各ファイルにアクセスできるグループを識別する、カンマ区切りの数値リストを含むフィールドを持つファイル情報を格納するテーブルがあります。

各ユーザーのアクティブなグループはセッションに保存されるため、セッション内のカンマ区切りの番号リストと、テーブル列に保存されているカンマ区切りのリストを比較する必要があります。セッション内のいずれかのグループが列内のいずれかのグループと一致する場合、ファイルはアクセス可能です。

例えば ​​:

リソース 1 には、「1,13,15」が入力された rgroups フィールドがあり、これらの 3 つのグループがリソースを表示できることを示しています。

リソースを一覧表示するページには、$matches がアクティブなグループのセッションから取得される次のクエリがあります。

SELECT * FROM resources WHERE rgroups IN ($matches)

これは、1 つのグループがアクティブな場合 (つまり、WHERE 1 IN (1,13,15)) では正常に機能するように見えますが、複数のグループがアクティブな場合はどうなるでしょうか?

SELECT * FROM resources WHERE 1,14 IN (1,13,15)

それとも、別のより複雑なクエリが必要ですか?

ありがとう!

4

3 に答える 3

1

より複雑なクエリが必要です。また、最初のバージョンは機能しないと思います。作業バージョンでは次を使用する必要がありますlike

where concat(',', $matches, ',') like concat('%,', rgroups, ',%')

複数のグループのアイデアを拡張できます。

where concat(',', $matches, ',') like concat('%,', rgroup1, ',%') and
      concat(',', $matches, ',') like concat('%,', rgroup2, ',%') and
      concat(',', $matches, ',') like concat('%,', rgroup3, ',%')

rgroup<n>グループの要素はどこにありますか。

rgroup に含まれる要素の数がわかっている場合は、次のようにすることができます。

where find_in_set($matches, substring_index(rgroups, 1)) > 0 and
      find_in_set($matches, substring_index(rgroups, 2)) > 0 and
      find_in_set($matches, substring_index(rgroups, 3)) > 0

最大値がわかっている場合は、次を試すことができます。

where (substring_index(rgroups, 1) = 0 or  find_in_set($matches, substring_index(rgroups, 1))) and
      (substring_index(rgroups, 2) = 0 or  find_in_set($matches, substring_index(rgroups, 2))) and
      (substring_index(rgroups, 3) = 0 or  find_in_set($matches, substring_index(rgroups, 3))) and
      . . .
于 2013-02-15T17:59:15.933 に答える
1

ゴードン・リノフが言ったことと、ネット上の他の場所で見たものに基づいて解決策を見つけました。

答えの本質は次のとおりです。

$matcharr = explode(",", $matches);

$mysqlwhere = "";
foreach($matcharr as $item){
$mysqlwhere .= "$item IN (rgroups) OR ";
}
$mysqlwhere = substr($mysqlwhere,0,-3);
$only4group = "AND (" . $mysqlwhere . ")";

$matches でアクティブなグループのセッションを取得して分割し、次のクエリを作成します。

SELECT * FROM resources WHERE rarea = 'shared' AND (1 IN (rgroups) OR 13 IN (rgroups) ) ORDER BY rarea, rname

ご助力いただきありがとうございます!

于 2013-02-16T03:25:08.213 に答える
1

In 句は、ネストされた OR 条件です。where rgroups in ('1','13','15) は Where (rgroups = '1' OR rgroups ='13' OR....) と言うのと同じです。

ある種の汎用関数で SQL ステートメントを作成し、それを DB に適用するだけです。

楽しみ。

于 2013-02-15T17:57:09.137 に答える