0

我有 2 张桌子。父表是learn_more,子表是reference_keys 两个表都是innodb

reference_keys has two columns:
key_id [index]
key_href


learn_more table
id [primary]
keys_id [foreign key]
page_title    
page_content

我想要做的是从 reference_keys 表中获取更多信息表中的多个链接。例如,learn_more table id:1, keys_id:1,3,4,8,13,25,..., page_title:Home Page: blah blah, page_content: blah blah......

问题是 phpmyadmin 不允许我在 learn_more 的 keys_id 中放置超过 1 个 id。

//错误
//警告:#1265 第 1 行的列 'keys_id' 的数据被截断

我猜关系视图设置不正确。- 我该如何解决?

在我的页面上,它在回显中显示 key_id 而不是 id 的值:这是 key_href。所以我的页面显示“1”而不是 1 的值,这是一个链接..

也许我的sql查询不正确?

$SQL = "SELECT * FROM learn_more WHERE page_title = '$this_page'";
4

3 回答 3

2

在这里建立一个多对多是你可以做的:

reference_keys has two columns:
key_id [index]
key_href

learn_more_to_reference_key
reference_key_id [FK to reference_keys]
learn_more_id [FK to learn_more]

learn_more table
id [primary]
page_title    
page_content

那么你在关系的每一边基本上都有一个 1:N。请注意,我也从 learn_more 表中删除了 FK。

因此,要获取您要查询的关系,如下所示:

SELECT * FROM Learn_More lm 
INNER JOIN learn_more_to_reference_key lmtrk ON lm.id = lmtrk.learn_more_id 
INNER JOIN reference_keys rk ON rk.id = lmtrk.reference_key_id

我相信内部连接是正确的,我正在仔细检查。

于 2012-07-11T17:18:15.587 回答
1

如果要让learn_more中的一行对应reference_keys中的多行,则需要将learn_more表中的外键字段移动到reference_keys表中。

因此,与其在 learn_more 中有一个指向多行 reference_keys 的外键字段(正如您似乎遇到的那样,不支持),而是让多行 reference_keys 都指向 learn_more 表。

这将实现 learn_more 和 reference_keys 之间的一对多关系。如果您需要多对多关系(其中每个 reference_key 行可以连接到许多 learn_more 行,反之亦然),您需要使用第三个表来建立两个数据库之间的链接。有关详细信息,请参阅http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php

于 2012-07-11T17:19:26.207 回答
1

你得到了,keys_id因为那是learn_more表中的内容。要获得key_href,您需要JOINlearn_more表添加到reference_keys表。此外,@ametren 是正确的 - 您应该有一个多对多表来链接您的两个当前表。

key_linking_table
id [primary and foreign key]
keys_id [primary and foreign key]

$SQL = 
"SELECT lm.id, lm.page_title, lm.page_content, rk.key_href
 FROM learn_more AS lm
 LEFT JOIN key_linking_table AS klt
 ON klt.id = rk.id
 LEFT JOIN reference_keys AS rk
 ON klt.key_id = rk.key_id
 WHERE [condition]"
于 2012-07-11T17:19:30.997 回答