mysql - 匹配两列值
问题描述
我有 2 张桌子。“用户城市”和“访问”。我想检查用户是否访问了他不应该访问的城市。
CREATE TABLE `user_cities` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT,
`name` varchar(255),
`city_id` INT,
PRIMARY KEY (`id`)
);
CREATE TABLE `visits` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT,
`visit_id` INT,
`city_id` INT,
PRIMARY KEY (`id`)
);
INSERT INTO `user_cities` VALUES
(1, 1, 'John', 35),
(2, 1, 'John', 36),
(3, 1, 'John', 37),
(4, 2, 'Michael', 38),
(5, 2, 'Michael', 39);
INSERT INTO `visits` VALUES
(1, 1, 1, 35),
(2, 1, 2, 36),
(3, 1, 3, 38),
(4, 2, 4, 38),
(5, 2, 5, 39);
http://sqlfiddle.com/#!9/68c658
示例:John 必须只访问 35、36 和 37。Michael 必须访问 38 和 39。这些在 'user_cities' 中定义
然而,约翰访问了 38(访问 id 3)
如何查询访问错误城市的用户?
解决方案
如果您不熟悉 SQL,那么这种问题比看起来要复杂一些。
您想从 user_cities 未指定访问的访问中选择信息。执行此操作的常用方法是对 user_cities 表使用 LEFT JOIN 以获取验证访问的记录,然后查找 LEFT JOIN 无法找到匹配项的条目。
所以你的查询是:
SELECT *
FROM visits
LEFT JOIN user_cities
ON(visits.user_id = user_cities.user_id AND
visits.city_id = user_cities.city_id)
WHERE user_cities.id IS NULL
当然,您可能还会扩展查询以提供用户的名称(以及 coty,但这不在您的示例代码中)
推荐阅读
- google-api - /androidpublisher/v3/applications/ 上的 403 禁止错误
- asp.net - 填充数据表时,传递给控制器的值为 null
- javascript - 将自定义 utf-8 字体添加到 jsPDF 导致“Uncaught TypeError: *.addFileToVFS is not a function”
- android - CodeceptJS + Appium = 应用程序不存在或不可访问
- python-3.x - Python Docx 缺少第一张图片
- c# - Xamarin(表单)iOS Entity Framework 迁移问题 - 实体上没有键(它是)错误
- python - 使用 python 处理复杂的 XML 数据
- r - 转置用户输入数据,Shiny 很慢
- slack - 发送消息时是否可以更改松弛的机器人图像和名称
- javascript - 这个 React 风格表达式的功能是什么?