4

2 つのテーブルを吐き出す MySQL を使用するストアド プロシージャがあります。例えば:

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

これをPHPで処理するにはどうすればよいですか?通常、私は 1 つのテーブルを扱っただけなので、次のようになります。

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

しかし、今は2つのテーブルがあります。では、これら 2 つのテーブルを PHP 経由で取得するにはどうすればよいでしょうか?

4

2 に答える 2

0

この方法で2つのテーブルを取得できます:

ストアド プロシージャ

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 ;

select concat の後、 , rows で爆発できます。

私はあなたに助けを願っています

于 2012-11-19T16:16:39.703 に答える
0

両方のクエリの結果が必要な場合は、この方法では作成できません。あなたがしているのは、1 つのクエリであり、その後、別のクエリです。プロシージャの結果は 2 番目のクエリです。1 つの結果で両方が必要な場合は、SELECT を 1 つのみに結合する必要があります。おそらくユニオンを使用して、両方のテーブルからすべてのレジスタを取得する手順でクエリ結果が 1 つだけになるようにします。次のようなことを試してください:

CREATE PROCEDURE MyStoredProcedure(IN 入力 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 に答える