Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Sql选择数组在列中的位置_Mysql_Sql_Select_Where_Where In - Fatal编程技术网

Mysql Sql选择数组在列中的位置

Mysql Sql选择数组在列中的位置,mysql,sql,select,where,where-in,Mysql,Sql,Select,Where,Where In,在我的查询中,我使用联接表类别属性。假设我们有这样的行: category_id|attribute_id 1|1 1|2 1|3 我想得到满足以下两个需求的查询。我有一个允许属性为的变量php。如果数组是属性\u id的子集,则应选择类别\u id,如果不是-无结果 第一种情况: select * from category_attributes where (1,2,3,4) in category_attributes.attribute_id 应该没有结果 第二种情况 select

在我的查询中,我使用联接表类别属性。假设我们有这样的行:

category_id|attribute_id
1|1
1|2
1|3
我想得到满足以下两个需求的查询。我有一个允许属性为的变量php。如果数组是属性\u id的子集,则应选择类别\u id,如果不是-无结果

第一种情况:

select * from category_attributes where (1,2,3,4) in category_attributes.attribute_id
应该没有结果

第二种情况

select * from category_attributes where (1,2,3) in category_attributes.attribute_id
应给出所有三行,请参见开头的虚拟行

因此,我希望有标准SQL in的反面。

您可以将属性id聚合到数组中,并比较php中的两个数组

SELECT category_id FROM 
(select category_id, group_concat(attribute_id) as attributes from category_attributes
order by attribute_id) t WHERE t.attributes = (1, 2, 3);
但您需要找到另一种方法来比较数组,或者确保数组总是被排序。

解决方案 步骤1:按要检查的字段对数据进行分组

步骤2:将所需值列表与上一步中获得的记录左键连接

步骤3:现在我们有了一个列表,其中包含所需的值和表中相应的值。如果表中存在第二列,则第二列将等于所需值,否则为NULL

在右列中计算空值。如果它等于0,则表示该表包含所有必需的值。在这种情况下,返回表中的所有记录。否则,表中必须至少缺少一个必需值。所以,不要返回任何记录

样品 表数据:

所需值: 10,20,50

查询:

您可以使用group by并具有:

这假设该表没有重复项,这是属性映射表的典型情况。如果有可能,请使用:

having count(distinct ca.attribute_id) = 4

这不适合第一种情况。从category_attributes中选择*,其中category_attributes.attribute_id位于1,2,3,4中;将给出所有结果。我不想要这个,我知道怎么用。我已经写了我需要的新语法。改变了答案。希望这能有所帮助。您是否尝试过您的查询?我得到一个错误操作数应该包含1列。我只做了一点更改就成功运行了您的查询。然而,第一种情况没有得到实施。查询1、2、3、4的参数不应给出任何结果。是否有多行具有相同的属性\u id?如果是的话,你如何决定返回哪个类别的id?@Nick实际上是的。但我有一个非常复杂的疑问。我不会直接使用select。我只需要一部分。整个查询在category_id上有join。因此根据我的估计,join之后的结果将类似于提供的伪表。我需要过滤那张表。我试过右连接,不同的where's,子查询。我不知道如何执行我的任务。知道这个问题以前从未问过,这是非常令人惊讶的。@Anees对我来说,更令人惊讶的是我两次被否决。我不知道为什么。不过,我同意。我开始觉得我做错了事情。然而,没有人提出任何简单的解决方案。这可能是因为这个问题乍看起来很愚蠢。但这是有效的,甚至是有趣的,实际上你已经得到了我的+1。应该有一个更简单的解决方案,我没有尝试过,我也不是SQL方面的专家。但这看起来不起作用,因为count*将对分组在一起的记录进行计数,如果属性标识是唯一的,则等于1,而不是有多少唯一的属性标识。@Anees。计数*统计匹配类别的数量。这似乎正是OP想要的。您对SQL和GROUPBY有些误解。
select ca.category_id
from category_attributes ca
where ca.attribute_id in (1, 2, 3, 4) 
group by ca.category_id
having count(*) = 4;  -- "4" is the size of the list
having count(distinct ca.attribute_id) = 4