1

我已经在这个网站和网络上环顾四周,但到目前为止还没有任何运气。

问题:

我有一个存储文件信息的表,其中包含一个以逗号分隔的数值列表,标识哪些组可以访问每个文件。

每个用户的活动组都存储在一个会话中,因此我需要将会话中以逗号分隔的数字列表与存储在表格列中的逗号分隔列表进行比较。如果会话中的任何组与列中的任何组匹配,则该文件是可访问的。

例如 :

资源 1 的 rgroups 字段由“1,13,15”填充,表明这 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

In 子句只是一个嵌套的 OR 条件。Where rgroups in ('1','13','15) 与说 Where (rgroups = '1' OR rgroups ='13' OR....) 相同

只需在某种通用函数中构造您的 SQL 语句并将其应用于数据库。

享受。

于 2013-02-15T17:57:09.137 回答
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, ',%')

wherergroup<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

我根据 Gordon Linoff 所说的以及我在网上其他地方看到的内容找到了一个解决方案。

答案的本质是:

$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 回答