如何将表 id 字段连接到另一个表 id 字段? [关闭]

Posted

技术标签:

【中文标题】如何将表 id 字段连接到另一个表 id 字段? [关闭]【英文标题】:How do I connect a table id field to another table id field? [closed] 【发布时间】:2013-02-20 11:46:01 【问题描述】:

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

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

我正在使用以下字段制作一张表格(电影): ID、TITLE、DIRECTOR、YEAR 和 CATEGORY_ID。

此表应与另一个类别表相关。所以第一个表中的 CATEGORY_ID 字段应该连接到存储类别的表。

我的 CATEGORY_ID 字段有问题。由于第一个 ID 字段设置为主要字段并且自动缩进我不能在 CATEGORY_ID 字段上使用它,所以当我从 phpmyadmin 中添加电影作为测试时,我只会在类别 ID 上获得 ID 编号 0。

只是为了展示我所做的表格布局:

MOVIE TABLE - ID(主键、自动缩进)、TITLE、DIRECTOR、YEAR、CATEGORY_ID 类别表 - CATEGORY_ID,类别

【问题讨论】:

你最近读过外键吗? 您的列名包含空格,如类别 ID。尝试使用 category_id 之类的东西作为开始。从长远来看,它可能会拯救你。提供更好的数据库模式。发布代码时至少缩进 4 个空格,以便它们在 *** 上正确格式化。您可能必须学习一些基础知识才能获得更快的结果 只需编辑您当前的问题。它可能会变得更清晰,更容易处理。让我们看看你到目前为止做了什么。这可能是一个很好的起点。 @StewardGodwinJornsen 离题,但您的网站似乎有问题(标头已发送警告) 我还在努力。今天才注意到。 :) 我可能会用 ob_start()/ob_flush() 来解决这个问题。主机的常见问题。以前不在那里。来自 Codeigniter 的会话库 【参考方案1】:

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

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

[编辑]

感谢您花时间编辑您的问题并进行必要的更改:

示例数据库架构

类别表

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 脚本解决。该列可能设置为不为空,因此提供了默认值。

PHP 脚本

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

创建选择下拉菜单

如果您将 category_id 列设置为非空,0 会更快乐。没什么奇怪的。在更新期间,重复相同的过程。请注意,选择将具有如下所示的特殊格式:

<?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匹配外键的电影就不会被选中。

副标题

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

【讨论】:

嗨!感谢您的长回答!这真的很有帮助!我想我的想法有点复杂。我应该自己给每个类别(例如“戏剧”“惊悚片”等)一个编号,对吗?在我看来,我认为它应该是由数据库自动添加的,就像添加电影时自动添加电影 ID 号一样......这解决了我的问题:) 现在要看看它是如何工作的!谢谢! 你有两个选择,要么给他们你自己的ID,要么让自动增量提供这些ID。如果你想要数字和字符串的组合,你可以在自动增量之外有额外的字段来提供特殊的 id。 别忘了重新阅读我上面的内容。我一直在更新它,因为我在试图睡觉的同时打字。 对不起,我明白你的意思了!但是,如果我只是测试从 phpmyadmin 中在电影表中添加电影,我需要手动填写 category_id 编号,对吗?一旦我编写了 php 代码并从网站添加了一部电影,我就可以让它在“值”代码等的帮助下自动存储正确的 category_id...【参考方案2】:

这是一个非常常见的一对多关系数据库设计示例。注意 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)
) 

【讨论】:

你好。在这种情况下,要求电影的标题是唯一的可能是不好的。如果电影被保留或出现同名电影会怎样?提醒一下 我认为可能是这种情况,因此您应该删除 UNIQUE 约束。如果输入了重复的 TITLE 或将其重命名为现有的,则会发出数据库错误。为了避免一个相当神秘的数据库,UI 会在发出插入或更新命令之前测试重复项。 感谢您的 cmets!我设法解决了这个问题,但当然我现在遇到了新问题,所以开始一个新线程:)【参考方案3】:

您可能正在寻找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)

【讨论】:

感谢您的快速回复! 欢迎您。如果你想要一个更好的例子,告诉我你想连接的表名和列,我会给你一个模板 我的问题是在创建表时在 phpmyadmin 中。当我尝试从 phpmyadmin 添加电影时,表 1 中的类别 ID 为 0。它应该与表 2 中的类别 ID 相同吗? 您是否将列设置为增量?此外,您可以进行更新以将值设置为您想要的类别 ID。 抱歉,我的 cmets 在我完成之前一直在发布。我想知道我是否在表格中的字段做错了?我在表 1 中有一个 ID 字段和一个 CATEGORY ID 字段,然后在表 2 中有一个 CATEGORY ID 字段。我只是不明白如何让 CATEGORY ID 编号自动增加并在两个表中相同。跨度>

以上是关于如何将表 id 字段连接到另一个表 id 字段? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何将一个表中某个字段的值全部更新到另外一个表相应的字段

如何加入/子查询第二个表

如何将表数据连接到一个逗号分隔的列中[重复]

从一个连接到另一个表 SQL 的表中删除记录

MYSQL怎么将表中的A字段值更新B字段值?求sql语句

mysql,想将表A字段a的数据复制到表B的a字段,应该如何写?