MySQL一对多删除特定 'many'

标签 mysql

我有一个具有一对多关系的数据库( field 、相关类别),如下所示:

venue_id | venue_name
---------------------
1        | venue1
2        | venue2

和类别

venue_id | category_id
---------------------
1        | 5
2        | 7
1        | 8
2        | 5

我想显示 category_id 为 5,但 category_id 为 7 和 8 的所有场所。我尝试使用如下连接:

SELECT distinct(`venue_to_category`.`venue_id`),`venue_name` 
FROM `venue_to_category` INNER JOIN `venues` 
    ON `venues`.venue_id = `venue_to_category`.venue_id 
WHERE `category_id` != 7
AND `category_id` != 8 
AND `category_id` = 5

但它没有返回正确的结果(事实上我不确定它返回的结果)

最佳答案

您的案例中有 2 件事

  1. 获取category_id = 5 而不是 7 或 8 的数据
  2. 获取类别id = 5 且不同时为 7 和 8 的数据

对于第一个,您可以使用

select
v.venue_id,
v.venue_name
from venues v
join categories c on c.venue_id = v.venue_id
where c.category_id = 5
AND NOT EXISTS
(
  select 1 from categories c1 where v.venue_id = c1.venue_id
  AND c1.category_id in (7,8)
);

第二个

select
v.venue_id,
v.venue_name
from venues v
join categories c on c.venue_id = v.venue_id
where c.category_id = 5
AND NOT EXISTS
(
  select 1 from categories c1 where v.venue_id = c1.venue_id
  AND c1.category_id in (7,8) having count(*) = 2
);

<强> DEMO

关于MySQL一对多删除特定 'many',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799442/

相关文章:

mysql - 高效的 SQL 查询来查找列表之间的重叠

PHP-查询结果到新数据库

PHP-MySql : Adding Friend

mysql - 在 MYSQL 运行时在 Select Query 中创建临时表

尝试递增日期字段时,MySQL 出现重复输入错误?

python - google CloudSQL mysql 表情符号(1366、 "Incorrect string value: '\\xF0\\x9F\\x98\\x80\\xF0\\x9F.. .' for column ' 名称'在第 1 行")

mysql - 在xampp中备份mysql数据库?

c# - MySQL 数据读取器和复选框

php - 教义不在

php - 检索最接近(之前和之后)给定日期的记录