来自一个MySQL表的数据将在另一个表中使用

时间:2013-01-06 08:16:26

标签: php mysql select inner-join

概要

当显示TABLE2中的数据时,将TABLE2的TOPIC字段中的数字替换为TABLE1中关联的TOPIC_NAME。

详情:

我在同一个MySQL DB中有2个表。我需要帮助从TABLE1填充数组以供TABLE2使用。如果重要,我正在使用PDO。

没有更新或插入......只显示单词而不是数字。

我是否将TABLE2 Foreach显示循环嵌套在TABLE1的Foreach循环中?

...或

我可以首先使用TOPIC数据填充数组,然后执行TABLE1 Foreach显示循环吗?

...或

我可以使用TABLE2中的数据从TABLE1引用TOPIC_NAME而无需创建数组吗?

...或

???

============================

TABLE1 是一个主题列表。

TABLE1语法:

TOPIC_NUM,TOPIC_NAME

TABLE1的样本记录:

1,TOPIC1

2,TOPIC2

等...

============================

TABLE2 是个人和相关数据的列表。

TABLE2语法:

ID,名称,状态,TOPIC,YEAR

TABLE2的样本记录:

1,John Smith,MA,2,2005

2,Jane Doe,AZ,1,2009

等...

============================

仅供参考:在上面的样本记录中,州名缩写后的数字是TOPIC。

这是我的代码:

<?php 

try {

    $db = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $db->exec("SET CHARACTER SET utf8");


// TABLE1
$tablename1 = 'topics';
$topics_col1 = 'TOPIC_NUM';
$topics_col2 = 'TOPIC_NAME';

// TABLE2
$tablename2 = 'people';
$items_col1 = 'NAME';
$items_col2 = 'STATE';
$items_col3 = 'TOPIC';
$items_col4 = 'YEAR';


$items_q = "SELECT $items_col1, $items_col2, $items_col3 FROM $tablename2";
$items = $db->query($items_q);

foreach ($items as $items_row) {
?>

<h2><?php 
/*


THIS IS WHERE THE TOPIC_NAME FROM TABLE1 SHOULD DISPLAY


*/
?></h2>

<p>
<?php echo $items_row[$items_col1];?>
<br />
<?php echo $items_row[$items_col2];?>
<br />
<?php echo $items_row[$items_col3];?>
<br />
<?php echo $items_row[$items_col4];?>
</p>

<?php   
} // end FOREACH

    $db = null; // close the database connection

} // end TRY
catch(PDOException $e) {
    echo '<span class="error">ERROR:</span><br />'.$e->getMessage() . "<br />";
    die();
} // end CATCH

?>

2 个答案:

答案 0 :(得分:0)

只需使用INNER JOIN

即可
SELECT  a.ID, a.NAME, a.STATE, b.TOPIC_NAME , a.YEAR
FROM    table2 a
        INNER JOIN table1 b
            ON  a.topic = b.topic_num

答案 1 :(得分:0)

供将来参考,以下是此脚本的最终版本。我已经添加了一个注释部分,该部分使用“点”方法显示了查询的替代编码方法。

我已经测试了这个脚本(使用这两种方法)并且它的功能非常完美。

<?php 

try {

    $db = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $db->exec("SET CHARACTER SET utf8");


// TABLE1
$tablename1 = 'topics';
$topics_col1 = 'TOPIC_NUM';
$topics_col2 = 'TOPIC_NAME';

// TABLE2
$tablename2 = 'people';
$items_col1 = 'NAME';
$items_col2 = 'STATE';
$items_col3 = 'TOPIC';
$items_col4 = 'YEAR';


$items_q = "SELECT $items_col1, $items_col2, $items_col3, $items_col4, $topics_col2 
FROM $tablename2 
JOIN $tablename1 on ($items_col3 = $topics_col1)";

/* ALTERNATE METHOD FOR QUERY

(*No need for all of the vars above using this method.)
$items_q = "SELECT $tablename2.NAME, $tablename2.STATE, $tablename2.TOPIC, $tablename2.YEAR, $tablename1.TOPIC_NAME 
FROM $tablename2 
INNER JOIN $tablename1 on ($tablename2.TOPIC = $tablename1.TOPIC_NUM)";

*/

$items = $db->query($items_q);

foreach ($items as $items_row) {
?>

<h2><?php echo $items_row[$topics_col2];?></h2>

<p>
<?php echo $items_row[$items_col1];?>
<br />
<?php echo $items_row[$items_col2];?>
<br />
<?php echo $items_row[$items_col3];?>
<br />
<?php echo $items_row[$items_col4];?>
</p>

<?php   
} // end FOREACH

    $db = null; // close the database connection

} // end TRY
catch(PDOException $e) {
    echo '<span class="error">ERROR:</span><br />'.$e->getMessage() . "<br />";
    die();
} // end CATCH

?>