【问题标题】:How do I write a query that compares each row of one table to all the rows of a different table in MySQL?如何编写一个查询,将一个表的每一行与 MySQL 中不同表的所有行进行比较?
【发布时间】:2020-07-24 12:57:43
【问题描述】:

所以我试图将员工的纬度和经度与 covid 收容区的经纬度相匹配。在我的数据库中,我有一个名为“employee”的表,其中包含“Row_index”、“Address”、“Employee_ID”、“Latitude”和“Longitude”列, 以及名为“red_zones”的第二个表,其中包含“Location_index”、“Address”、“Latitude”和“Longitude”列。

现在我必须将“员工”表中每个员工的经纬度与“红色区域”表中所有收容区的经纬度进行匹配。 我决定通过遍历“red_zones”表来使用存储过程:

    BEGIN
        DECLARE i, locationCount INT DEFAULT 0;
        DECLARE lat, lon VARCHAR(45) DEFAULT ' ';
        SELECT COUNT(*) INTO locationCount FROM red_zones;
        WHILE i <= locationCount DO
            SET i = i+1;
            SELECT Latitude INTO lat FROM red_zones WHERE Location_index = i;
            SELECT Longitude INTO lon FROM red_zones WHERE Location_index = i;
            SELECT Employee_ID FROM employee WHERE Latitude = lat AND Longitude = lon;
        END WHILE;
    END

调用该过程后,我收到错误“已达到最大结果计数,无法显示更多结果”。我想这可能是因为“red_zones”表中的行数超过了 700。

所以我决定改为遍历“员工”表(26 行):

BEGIN
    DECLARE i, employeeCount INT DEFAULT 0;
    DECLARE lat, lon VARCHAR(45) DEFAULT ' ';
    DECLARE flag INT DEFAULT NULL;
    SELECT COUNT(*) INTO employeeCount FROM employee;
    WHILE i <= employeeCount DO
        SET i = i+1;
        SELECT Latitude INTO lat FROM employee WHERE Row_index = i;
        SELECT Longitude INTO lon FROM employee WHERE Row_index = i;
        SELECT Location_index INTO flag FROM red_zones WHERE Latitude = lat AND Longitude = lon;
        IF flag != NULL THEN
            SELECT Employee_ID FROM employee WHERE Row_index = i;
        END IF;
    END WHILE;
END

这个过程根本没有给我任何输出。 我还确保两个表之间存在匹配的经纬度。

我应该寻求修改我的程序吗?如果是,以什么方式? 还是我应该寻找一种完全不同的方法来实现我的目标?

谢谢。

【问题讨论】:

  • 为什么不是join?请提供一些具有预期输出的示例数据。
  • 我是 mysql 新手,不了解 join 提供的功能!
  • 只是出于好奇,为什么我不能通过程序达到相同的结果?由于我只使用过 java,所以我想到的第一个解决方案是遍历所有行。
  • @AarnavShah。 . .您需要在您的组织中找到了解数据库的人员。它们与 Java 等语言完全不同,而且你的大部分直觉不会轻易转移(尤其是关于模块化和过程的任何事情)。您可能还应该找到一些关于 SQL 的教程来学习该语言的基础知识——JOIN 是该语言的基本部分。

标签: mysql sql


【解决方案1】:

一个简单的inner join 将为您提供所有在redzone 中的员工。

SELECT emp.*
FROM employee emp
JOIN red_zones rz ON emp.Latitude = rz.Latitude
                  AND emp.Longitude = rz.Longitude

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2022-11-05
    • 2021-05-12
    相关资源
    最近更新 更多