从PHP数组中过滤MySQL结果

时间:2011-02-03 11:27:54

标签: php mysql

希望这是一个快速的php问题...

我在'1,2,3'这样的用户表的字段中存储了许多id。我现在想要根据这些数字查询另一个表。我认为我的大脑今天早上已经变得糊里糊涂,因为似乎无法做到正确......

可以在查询中使用“IN”吗?

更新 -

意识到我没有很好地解释自己......

我有两个表,一个用于用户(id,用户名,密码,产品)''products'字段有逗号分隔的id,其中包含另一个包含产品信息的表。

我基本上试图通过查询具有该用户权限的数据库来过滤掉用户可以看到的内容。

6 个答案:

答案 0 :(得分:2)

您应该修复数据库架构;然后,查询将是显而易见和有效的。

数据库中的每一列都应包含原子值。如果您在一个列中存储了多个值,则意味着您应该创建一个具有一对多关系的表。

CREATE TABLE user_whatever (user_id int, whatever_id int)

...每个项目与用户相关的一行。要根据这些数字查询另一个表,您只需在查询中JOIN这个新表。

答案 1 :(得分:1)

您可能最好使用加入,很难从您的问题中判断出您正在使用哪种数据。

使用大量数据加入会更有效率。

在不知道您的数据库结构的情况下,无法进一步提供帮助

SELECT column_names
FROM table_one
INNER JOIN table_two
ON table_one.column_name=table_two.column_name

是基本语法。

答案 2 :(得分:0)

您可以在SQL中使用IN而不会出现任何问题,但您需要将PHP数组转换为兼容列表,例如使用implode(separator,array)函数...

[更新]看到问题更新:您选择用于保存“产品”的技术不是很好,将来会导致您遇到问题。存储这些值的标准解决方案是创建一个附加表(userid,productid),主键是两个字段,为每个用户/产品权限创建多行。

要实际使用您创建的特定解决方案,您需要运行SQL从表中获取值,然后使用SECOND SQL使用WHERE IN $ ID实际获取数据(据我所知,您可以不要在字符串结果上使用IN(在SQL中没有EVAL这样的东西)

答案 3 :(得分:0)

像所有人说的那样,你应该使用原子价值。但由于每个人都已经解释过,我只是要详细说明你应该做些什么。

为用户使用表格,其中包含ID,用户名和密码,但没有产品

id - username - password  
1  - mike     - XXXX  
2  - joe      - XXXX

然后你有你的产品表

id - name                 - price
1  - Aluminum bat         - 19.99
2  - Scattergun           - 39.99
3  - BONK (with isotopes) - 14.99

现在,您将介绍第三个表,表示用户已购买的内容。

user - product
1    - 2
1    - 3
2    - 1

现在,如果要选择mike已购买的产品,只需从第三个表中选择用户ID等于1的所有行。结合外键和索引,查询也应该具有更好的性能。为了澄清,这就是我的示例在您当前的实现中的样子。

id - username - password - products
1  - mike     - XXXX     - 2,3
2  - joe      - XXXX     - 1

答案 4 :(得分:-1)

$sql = "SELECT * FROM table
WHERE id IN (";

$i=1;
$count = count($array);
foreach($array as $a){
if($i==$count){
$sql .= $a['id'];
}else{
$sql .= $a['id'].','
}
$i++;
}

$sql .= ")";

请试试这个..

答案 5 :(得分:-1)

从第一个表格中获取带有ID('1,2,3')的字段到某个变量 - > $ids

$sql = sprintf(SELECT * FROM second_table WHERE id IN (%s),$ids);

希望这有帮助。

ps。:我不建议以这种方式存储id。