Mysql 其中 A 列 = X 和 B 列 = Y 和/或 B 列 = Z
Mysql Where Column A = X and Column B = Y and or Column B = Z
我正在尝试从数据透视表 table 中获取一组值,其中 A 列等于值数组,因此例如 ID 12 的 attribute_value_id 等于 3 和 9 . 这能做到吗?我已经走到这一步了...
ID | post_id | attribute_id | attribute_value_id
8 12 1 3
9 12 2 13
10 13 1 3
11 13 2 9
12 16 1 3
13 16 2 9
88 11 1 1
89 11 2 8
90 11 3 18
91 11 4 22
查询...
select *
from `searching_for_posts`
where (
select count(*)
from `attributes`
inner join `searching_for_attributes`
on `attributes`.`id` = `searching_for_attributes`.`attribute_id`
where `searching_for_attributes`.`searching_for_post_id` = `searching_for_posts`.`id`
and (`attribute_value_id` = 3 and `attribute_value_id` = 9)
) >= 1
如果我使用 and
,那么我将得不到任何值。如果我使用 or
那么我会得到 3 个值,但它应该是 return 2。我的 SQL 经验有限。
您可以使用 group by
和 having
执行此操作。你的逻辑很难理解,但是是这样的:
select post_id
from table t
where attribute_value_id in (3, 9)
group by post_id
having count(distinct attribute_id) = 2;
我认为您也想查看 attribute_id
,但这似乎不是问题的一部分。
编辑:
如果这些存储在另一个table:
select a.post_id
from attributes a join
searching_for_attributes sfa
on a.attribute_id = sfa.attribute_id and
a.attribute_value_id = sfa.attribute_value_id
group by a.post_id
having count(*) = (select count(*) from searching_for_attributes);
为了回应@GordonLinoff 的回答,我设法使用 GROUP BY 和 HAVING COUNT 来获取所需的数据。这是我想出的,希望这对其他人有帮助...
select *
from `searching_for_posts`
where (
select count(*)
from `attributes`
inner join `searching_for_attributes` on `attributes`.`id` = `searching_for_attributes`.`attribute_id`
where `searching_for_attributes`.`searching_for_post_id` = `searching_for_posts`.`id`
and `attribute_value_id` in (3, 9)
having count(distinct `attributes`.`id`) = 2
) >= 1
group by `id`
我正在尝试从数据透视表 table 中获取一组值,其中 A 列等于值数组,因此例如 ID 12 的 attribute_value_id 等于 3 和 9 . 这能做到吗?我已经走到这一步了...
ID | post_id | attribute_id | attribute_value_id
8 12 1 3
9 12 2 13
10 13 1 3
11 13 2 9
12 16 1 3
13 16 2 9
88 11 1 1
89 11 2 8
90 11 3 18
91 11 4 22
查询...
select *
from `searching_for_posts`
where (
select count(*)
from `attributes`
inner join `searching_for_attributes`
on `attributes`.`id` = `searching_for_attributes`.`attribute_id`
where `searching_for_attributes`.`searching_for_post_id` = `searching_for_posts`.`id`
and (`attribute_value_id` = 3 and `attribute_value_id` = 9)
) >= 1
如果我使用 and
,那么我将得不到任何值。如果我使用 or
那么我会得到 3 个值,但它应该是 return 2。我的 SQL 经验有限。
您可以使用 group by
和 having
执行此操作。你的逻辑很难理解,但是是这样的:
select post_id
from table t
where attribute_value_id in (3, 9)
group by post_id
having count(distinct attribute_id) = 2;
我认为您也想查看 attribute_id
,但这似乎不是问题的一部分。
编辑:
如果这些存储在另一个table:
select a.post_id
from attributes a join
searching_for_attributes sfa
on a.attribute_id = sfa.attribute_id and
a.attribute_value_id = sfa.attribute_value_id
group by a.post_id
having count(*) = (select count(*) from searching_for_attributes);
为了回应@GordonLinoff 的回答,我设法使用 GROUP BY 和 HAVING COUNT 来获取所需的数据。这是我想出的,希望这对其他人有帮助...
select *
from `searching_for_posts`
where (
select count(*)
from `attributes`
inner join `searching_for_attributes` on `attributes`.`id` = `searching_for_attributes`.`attribute_id`
where `searching_for_attributes`.`searching_for_post_id` = `searching_for_posts`.`id`
and `attribute_value_id` in (3, 9)
having count(distinct `attributes`.`id`) = 2
) >= 1
group by `id`