4

我有一个使用 MySQL 的存储过程,它吐出两个表。例如:

DELIMITER //
CREATE PROCEDURE MyStoredProcedure(IN input VARCHAR(4))
SELECT * FROM BLAH;
SELECT * FROM MAH;
END //

我如何在 PHP 中处理这个?通常,我只处理一张桌子,所以它会是这样的:

$INPUT = mysql_real_escape_string($_POST['input']);
$sql = "CALL MyStoredProcedure('{$INPUT}')";
$res = $db->query($sql);
foreach ($res as $row) { 
    echo "<td>{$row->Column1}</td>";
}

但现在有两张桌子。那么如何通过 PHP 获取这两个表呢?

4

2 回答 2

0

我可以用这种方法得到两个表:

存储过程

DELIMITER $$
DROP PROCEDURE IF EXISTS `get_procedure`$$

    CREATE PROCEDURE `get_procedure`()
    BEGIN
    SELECT group_concat('<tr><td>',`blah_id`,'</td><td>',`blah_title`,'</td><tr>')  as tbl1 ,
 group_concat('<tr><td>',`mah_id`,'</td><td>',`mah_title`,'</td><td>',`mah_info`,'</td><tr>')  as tbl2
    FROM `blah`,`mah`;
    END $$

    DELIMITER ;

例如表:

CREATE TABLE IF NOT EXISTS `blah` (
  `blah_id` int(11) NOT NULL AUTO_INCREMENT,
  `blah_title` varchar(300) NOT NULL,
  PRIMARY KEY (`blah_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

CREATE TABLE IF NOT EXISTS `mah` (
  `mah_id` int(11) NOT NULL AUTO_INCREMENT,
  `mah_title` varchar(300) NOT NULL,
  `mah_info` varchar(32) NOT NULL,
  PRIMARY KEY (`mah_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

在选择 concat 之后,您可以使用 , rows 进行爆炸。

我希望对你有帮助

于 2012-11-19T16:16:39.703 回答
0

如果您想要这两个查询的结果,则不能以这种方式进行。您正在做的是一个查询,然后是另一个查询。该过程的结果是第二个查询。如果您只在一个结果中需要它们两个,则必须将 SELECT 组合成一个,也许使用联合,这样您的过程中将只有一个查询结果,所有寄存器都来自两个表。尝试这样的事情:

创建过程 MyStoredProcedure(IN input VARCHAR(4)) SELECT * FROM BLAH UNION SELECT * FROM MAH; 结尾

使用联合声明你有一些限制,你可以在以下链接中看到:http: //dev.mysql.com/doc/refman/4.1/en/union.html

如果两个表都具有相同数据类型的列,则可以使用它。如果没有,您可以执行以下操作:

CREATE PROCEDURE MyStoredProcedure(IN input VARCHAR(4)) SELECT b.column1, b.column2, ... , m.column1, m.column2, ... FROM BLAH as b, MAH as m; 结尾

希望这可以帮助!

于 2012-11-22T08:14:07.603 回答