2

到目前为止,我已经尝试了许多不同的方法来使用存储过程访问三个表上的数据。首先我尝试了一个简单的选择语句:

create procedure reportCodes () begin
SELECT Numbers.serial_numb, numOwner.lName, numOwner.fName, numOwner.email,
 location.long, location.lat, Numbers.dateValidated
FROM Numbers, Owner, location
WHERE Numbers.used = true AND Numbers.id=numOwner.Numbers_id AND     
 Numbers.id=location.Numbers_id; 
end$$

(改名以保护有罪者)

在 phpmyadmin 中运行存储过程会生成记录的第一个实例(测试数据库中两个“真”中的一个)。只运行:

SELECT Numbers.serial_numb, numOwner.lName, numOwner.fName, numOwner.email,  
 location.long, location.lat, Numbers.dateValidated
FROM Numbers, Owner, location
WHERE Numbers.used = true AND Numbers.id=numOwner.Numbers_id AND 
Numbers.id=location.Numbers_id;

在 phpmyadmin SQL 选项卡中返回两条记录。然后我尝试了一个临时表:

create procedure reportCodes () begin
CREATE TEMPORARY TABLE used_numbers AS (
SELECT Numbers.serial_numb, numOwner.lName, numOwner.fName, numOwner.email,
 location.long, location.lat, Numbers.dateValidated
FROM Numbers, Owner, location
WHERE Numbers.used = true AND Numbers.id=numOwner.Numbers_id AND 
 Numbers.id=location.Numbers_id);

SELECT * FROM used_numbers; end$$

返回 2 条记录中的 1 条作为过程,但两条记录都在控制台中。最后,我尝试将表更改为联接:

CREATE PROCEDURE reportCodes()
begin
create temporary table used_numbers AS (
SELECT Numbers.serial_numb, numOwner.lName, numOwner.fName, numOwner.email,
 location.long, location.lat, Numbers.dateValidated
FROM Numbers JOIN numOwner
ON Numbers.id=numOwner.Numbers_id 
JOIN location ON
 numOwner.Numbers_id=location.Numbers_id
WHERE Numbers.used = true
);

SELECT * FROM used_numbers; end$$

结果与上述相同。我不知道为什么只运行 SQL 会显示两个测试记录,但使用完全相同的代码运行该过程只会产生一个。谢谢

4

1 回答 1

0

在您的查询中, numOwners 不是被选中的有效表,所以出了点问题。您是否尝试在 phpMyAdmin 的“查询”窗口中运行 SQL 以确保完全相同的查询返回 2 行?

我假设“Owner”表应该是“numOwner”,所以我重写了下面的存储过程调用。另外,我不确定您在 Numbers.used 中存储的值类型是什么,以评估为“TRUE”。我假设您使用的是 TINYINT(1),所以我也对其进行了更改。我希望这有帮助。

DELIMITER $$

USE `db`$$

DROP PROCEDURE IF EXISTS `reportCodes`$$

CREATE PROCEDURE `reportCodes`()
BEGIN
  SELECT 
    n.serial_numb, 
    o.lName, 
    o.fName, 
    o.email,  
    l.long, 
    l.lat, 
    n.dateValidated
  FROM Numbers n
  INNER JOIN numOwner o ON n.id=o.Numbers_id 
  INNER JOIN location l ON n.id=l.Numbers_id; 
  WHERE n.used = 1
END$$

DELIMITER ;
于 2013-09-03T17:57:56.823 回答