如何将表id字段连接到另一个表id字段?

时间:2013-03-05 21:34:38

标签: php database database-design phpmyadmin

我是PHP和数据库的新手,我在创建我需要的数据库时遇到了一些问题。 我希望这里有人可以帮助我!可能是一个非常愚蠢的问题...

我要做的是创建一个非常简单的电影库并在phpmyadmin中创建表格。我还没有开始为此编写任何PHP代码,我只是想确保我正确地创建了数据库表。

我正在使用以下字段执行一个表(MOVIES): ID,TITLE,DIRECTOR,YEAR和CATEGORY_ID。

此表应与另一个类别表有关系。因此,第一个表中的CATEGORY_ID字段应连接到存储类别的表。

我在CATEGORY_ID字段中遇到问题。由于第一个ID字段设置为主要,而且自动缩进我在CATEGORY_ID字段上也没有。因此当我从phpmyadmin中添加电影作为测试时,我只是在类别ID上获得Id编号0。

只是为了显示我已经完成的表格布局:

电影表 - ID(主键,自动缩进),TITLE,DIRECTOR,YEAR,CATEGORY_ID
类别表 - CATEGORY_ID,CATEGORY

3 个答案:

答案 0 :(得分:1)

你需要多做一些研究才能获得完整的帮助。我建议你做一些谷歌搜索和阅读这样的文章:

http://www.sitepoint.com/mysql-foreign-keys-quicker-database-development/

[编辑]

感谢您抽出宝贵时间编辑问题并进行必要的更改:

示例数据库架构

CATEGORY TABLE

CATEGORY_ID int auto_increment (11) (primary key)
CATEGORY

电影表:

ID int auto_increment (Primary Key) 
TITLE, 
DIRECTOR, 
MOVIE_YEAR
CATEGORY_ID int(11) (Foreign Key)

现在你看到我的意思是外键;以上架构基于您的问题和示例。我只重命名年份专栏。我是小心的话或可能与保留字冲突的名字。我刚刚称它为MOVIE_YEAR。 TITLE字段不是唯一的。没有必要这样做。如果需要,为了防止重复,您可以在数据库中查询匹配项。但看到两部电影可能有相同的名字,他们的ID应该将它们分开。

Mysql的

表格中不需要两个自动增量列。首先创建类别表并加载类别的值。 Id列可以是自动增量还是不自动增量。如果不是,则必须手动提供ID。然后创建电影表。你正在做一对多的关系。意思是,一个类别可以匹配电影表中的许多电影。所以有0就没有错误。这个问题将由您的PHP脚本解决。该列可能设置为非null,因此提供了默认值。

PHP Scripting

在PHP中,创建代码以将类别表中的值拉入类似下拉选择或可单击链接的内容,并将它们传递给隐藏的表单元素。使用选择可以更快(参见下面的示例)。添加新电影所需的选择和其他表单元素将采用一种html格式。因此,当您提交表单时,它会将数据添加到电影表中。该数据将携带用户正在插入的category_id。这将取代你现在拥有的0。

创建选择下拉列表

如果您将category_id列设置为非null,则

0会更高兴。没什么奇怪的。在更新期间,重复相同的过程。请注意,select将具有如下所示的特殊格式:

<?php while($row = mysqli_fetch_assoc($connection, $recordset)){ ?>
    <select name='category_id' id='categories_id'>
        <options value='<?php echo $row['category_id'] ?>'><?php echo $row['category_name'] ?></option>
    </select>
<?php } ?>

这些值应来自您的数据库并填充选择菜单。这应该让你开始。因此,现在尝试使用您当前拥有的数据库来处理PHP方面。如果你有一个PHP代码,你可以显示它,所以我们都调整它。

忘记上下投票,我们不参加比赛。它被称为声誉。我们似乎有很多。 :)

显示记录

显示是棘手的部分。你需要加入。以下内容:

$sql='SELECT * FROM movies LEFT JOIN category ON movies.category_id = category.id';
$recordset_all = mysqli_query($connection, $sql);

这样的内容会为您提供有关电影和类别匹配记录的所有记录。这样,您就可以使用类别名称来处理所有电影。既然你似乎没有列名冲突,一切都应该没问题。如果您只想匹配行,请取出单词LEFT,这样就不会选择没有与电影中的外键匹配的category_id的电影。

小标题

如果您打算在类别名称的子标题中加载行,您的案例会变得复杂。在这种情况下,您必须进行两次数据库选择并创建一个函数来调用和返回相应的电影。可能有更好的方法。如果有必要,我们会解决这个问题。

答案 1 :(得分:0)

您可能正在寻找INNER JOIN

SELECT ... FROM table1 t1
INNER JOIN table2 t2 ON t1.key = t2.key
WHERE ...

可以找到有关表格加入的更多信息Here

请记住在列名称前加上表格的别名(在这种情况下,别名为t1t2

希望这有帮助。

编辑:这是一个示例更新和选择查询,您可以使用它来更新categoryID,然后选择使用内连接

UPDATE MovieTable 
SET categoryID = (number here)
WHERE (use unique identifier like ID or Title if it is unique) = (value)


SELECT my.Title FROM MovieTable mt
INNER JOIN CategoryTable ct ON mt.categoryID = ct.categoryID
WHERE ct.categoryID = (value)

答案 2 :(得分:0)

以下是一对多关系的非常常见的数据库设计示例。注意CATEGORIES有一个主键,用于关联MOVIES,它使用FOREIGN KEY语句。另请注意,TITLE必须是唯一的(我推测)。

create table CATEGORIES (
  ID int not null auto_increment,
  Description varchar(100),
  PRIMARY KEY (ID)
  );
create table MOVIES(
  ID int not null auto_increment,
  TITLE varchar(30),
  DIRECTOR varchar(30),
  YEAR datetime,
  CATEGORY_ID int,
  PRIMARY KEY (ID),
  UNIQUE KEY (TITLE),
  FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORIES(ID)
)