外键和分页

时间:2010-06-06 22:19:50

标签: php sql primary-key

这是我的分页脚本:

    <?php
/***********************************
 * PhpMyCoder Paginator            *
 * Created By PhpMyCoder           *
 * 2010 PhpMyCoder                 *
 * ------------------------------- *
 * You may use this code as long   *
 * as this notice stays intact and *
 * the proper credit is given to   *
 * the author.                     *
 ***********************************/
?> 
 <head>
     <title> Pagination Test - Created By PhpMyCoder</title>
        <style type="text/css">
   #nav { font: normal 13px/14px Arial, Helvetica, sans-serif; margin: 2px 0; }
   #nav a { background: #EEE; border: 1px solid #DDD; color: #000080; padding: 1px 7px; text-decoration: none; }
   #nav strong { background: #000080; border: 1px solid #DDD; color: #FFF; font-weight: normal; padding: 1px 7px; }
   #nav span { background: #FFF; border: 1px solid #DDD; color: #999; padding: 1px 7px; }
  </style>
    </head>
     <?php
   //Require the file that contains the required classes
   include("pmcPagination.php");

   //PhpMyCoder Paginator
   $paginator = new pmcPagination(20, "page");

   //Connect to the database
   mysql_connect("localhost","root","PASSWORD");
   //Select DB
   mysql_select_db("tvguide");

   //Select only results for today and future
   $result = mysql_query("SELECT programme, channel, airdate, expiration, episode, setreminder FROM epdata1 where airdate >= now() order by expiration GROUP BY airdate");
   //You can also add reuslts to paginate here
   mysql_data_seek($queryresult,0) ;
           while($row = mysql_fetch_array($result))
   {
    $paginator->add(new paginationData($row['programme'],
               $row['channel'],
               $row['airdate'],
               $row['expiration'],
               $row['episode'],
               $row['setreminder']));
   }
  ?>
        <?php
   //Show the paginated results
   $paginator->paginate ();
  ?><? include("pca-footer1.php"); ?>
        <?php
   //Show the navigation
   $paginator->navigation();      
  ?>

但是,我有两个表,它们是epdata1(我的节目主持人的播出时间是这里)和housemdep加上setreminder表。

如何使用与此相关的外键?我不确定这是否适用于我的脚本,但我愿意尝试。

我想要做的是从表housemdep中选择某些剧集 (节目的剧集)如果选择任何节目,则将其显示为:

House M.D. showing on Channel 1 June 6th - 8:00pm "Wilson" Set Reminder
House M.D. showing on Channel 1 June 7th - 1:30am "Wilson" Set Reminder
House M.D. showing on Channel 1 June 7th - 12:55pm "House's Head" Set Reminder

或者像这样,如果我没有从行中选择一集:

House M.D. showing on Channel 1 June 7th - 8:00pm "House's Head" Set Reminder
House M.D. showing on Channel 1 June 8th - 9:00pm  Set Reminder
House M.D. showing on Channel 1 June 9th - 2:30pm Set Reminder
House M.D. showing on Channel 1 June 7th - 8:00pm "Que Sera Sera" Set Reminder

外键和相互关联的表的关系对我来说是新的,如果有人可以提供帮助,我会很感激。

另外,我正试图为我的程序设置这个(如果你在浏览器中点击View Source,这就是代码的呈现方式):

<tr><td><b><a href="housemd.php">House M.D.</a></b></td><td>showing on <a href="channel/1"><i>Channel 1</i></a></td><td>June 9th - 7:00pm</td><td><b>"<a href="episodes/714790">House's Head</a>"</b></td><td><img src="reminder.gif" height="16" width="22"> <a href="reminder.php" alt="Set a reminder" target="_top">Set Reminder</a></td></tr>

House M.D。于6月10日 - 12:25在第1频道上露面“House's Head”设置提醒 House M.D。于6月10日下午12:55在第1频道上展示设置提醒 House M.D。第1频道 6月10日 - 晚上9:00 “Wilson”设置提醒 House M.D。 6月11日 - 1:30在第1频道上露面“Wilson”设置提醒 House M.D。第1频道 6月11日 - 晚上8:00 “生活在梦中”设置提醒 House M.D。第1频道 6月12日 - 晚上7:00展示设置提醒

我已经尝试了谷歌在另一个版本的脚本中建议外键的一些内容(这是我运行Apache和PHP 5.28 / MySQL的localhost服务器上的原始克隆),但我不知道如何实现这个

感谢。

1 个答案:

答案 0 :(得分:0)

如果我理解你在说什么,那么你希望让SQL查询连接两个表,并根据数据库的响应,根据是否在一个表或另一个表中找到行来显示行的方式有所不同。

你是正确的联接是你正在寻找的,它只是听起来你需要了解联接的类型。 INNER JOIN用于以下情况:您希望一个表中的行始终对应于另一个表中的行(如果没有相应的行,则永远不返回行)。 LEFT JOIN适用于您从一个表查询数据的情况,但您可能在另一个表中有或没有相应的行。

例如:一个人总是有父母(INNER JOIN)。

SELECT
  person.id,
  relative.id
FROM
  person
INNER JOIN
  relative
ON
  person.biological_mother_id = relative.id

在此示例中,将返回行,其中person.id和relative.id都将具有值,否则,数据库将不返回行,因为这些行与INNER JOIN条件不匹配。

但是,一个人不会总是有宠物(LEFT JOIN)。

SELECT
  person.id,
  pet.id
FROM
  person
LEFT JOIN
  pets
ON
  person.id = pets.owner_id

在这种情况下,可以返回行,其中person.id具有值,但pet.id没有值(在某些情况下为NULL值)。这是因为LEFT JOIN没有像INNER JOIN那样对返回的行设置约束,而是说“left”或“primary”表可以返回行值,但对于“right”或“secondary”它是可选的“表返回值。

通过这种方式,我们使用关系数据库来询问有关表之间关系的问题。如果您执行上述宠物查询,并且pet.id返回null,则表示该人没有宠物。