首页 > 解决方案 > 匹配两列值

问题描述

我有 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)

如何查询访问错误城市的用户?

标签: mysql

解决方案


如果您不熟悉 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,但这不在您的示例代码中)


推荐阅读