所以有这个数据库表:
此数组包含所选选项:
$options[1] = 1;
$options[2] = 5;
$options[3] = 3;
$options[4] = 2;
$options[5] = 1;
...
$options[x] = y;
现在,目标是获取所有item_ids,如果其中一个options数组的键中的option_id在其行中,则该值必须与options数组中的值相同。
例如:
选项1已选择值1
选项2已选择值5
选项3已选择值4
选项4已选择值2
所以我们应该选择item_id 1和其他item_ids,如果选项1 - >选项1 = 1并且如果选项2 - >选项2 = 5 AND如果选项3 - >选项3 = 4 AND ...
将在IN()中使用item_ids
从项目表中选择项目数据。
要点是用户在页面上选择一些选项,然后将选项放入数组,然后我必须找到符合所选选项的所有项目。在上表中,我们有项目和选项之间的关系,以及预定义的每个项目的选项值。
答案 0 :(得分:0)
$where = array();
foreach($options as $key => $value) $where[] = 'option_id = ' . $key . ' AND option_value = ' . $value;
$sql = 'SELECT DISTINCT item_id
FROM table
WHERE (' . explode(') OR (', $where) . ')';
然而,我可能完全误解了你的问题。
答案 1 :(得分:0)
我认为这可能适合你。没有测试过,它可能会爆炸,但是......
SELECT *
FROM items
WHERE (item_id in (
SELECT item_id
FROM optiontable
WHERE ((option_id = 1) and (option_value = 1)) or
((option_id = 2) and (option_value=5)) or
((option_id = 3) and (option_value=3)) or
((option_id = 4) and (option_value=2)) or
((option_id = 5) and (option_value=1))
GROUP BY CONCAT(option_id, ',', option_value)
HAVING COUNT(CONCAT(option_id, ',', option_value)) = 5
));
基本上,内部查询会拉出与所需选项行中某个成员行匹配的所有行。它对配对的option_id / option_value对进行人工分组/计数,并返回opt_id / opt_val对的数量最多为5行的行的item_ids。
您必须在客户端中动态构建此类查询,以便'where'子句条目的数量与having
子句中的数字匹配。
答案 2 :(得分:0)
<?php
$options = array(
1 => 1,
2 => 5,
3 => 3,
4 => 2,
5 => 1
);
$cases = array();
foreach($options as $id => $value){
$cases[] = "WHEN $id THEN $value";
}
$query =
'SELECT item_id '.
'FROM your_table '.
'WHERE option_value = CASE option_id '.implode(' ', $cases).' '.
'GROUP BY item_id';
echo $query;
?>
输出(由我格式化):
SELECT item_id
FROM your_table
WHERE option_value = CASE option_id
WHEN 1 THEN 1
WHEN 2 THEN 5
WHEN 3 THEN 3
WHEN 4 THEN 2
WHEN 5 THEN 1
GROUP BY item_id
测试此查询,并告诉我它是否按您期望的方式工作。 :)
$query =
'SELECT * FROM items '.
'WHERE id IN('.
'SELECT item_id '.
'FROM your_table '.
'WHERE option_value = CASE option_id '.implode(' ', $cases).' '.
'GROUP BY item_id)';