MySQL根据一个或多个可能的子句选择唯一值

时间:2011-07-13 20:50:33

标签: php mysql

所以有这个数据库表:

database table

此数组包含所选选项:

$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从项目表中选择项目数据。

要点是用户在页面上选择一些选项,然后将选项放入数组,然后我必须找到符合所选选项的所有项目。在上表中,我们有项目和选项之间的关系,以及预定义的每个项目的选项值。

3 个答案:

答案 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)';