PHP Mysql从多个表中选择查询

时间:2012-07-11 17:08:37

标签: php mysql phpmyadmin

我有2张桌子。父表是learn_mor e,子表是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表中获取多个链接。 例如,learn_more表id:1,keys_id:1,3,4,8,13,25,...,page_title:主页:blah blah,page_content:blah blah ......

问题是phpmyadmin不允许我在learn_more的keys_id中输入多于1个id。

  

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

我猜测关系视图设置不正确。 - 我该如何解决这个问题?

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

也许我的sql查询不正确?

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

答案 2 :(得分:1)

您获得的是keys_id,因为这是 learn_more 表中的内容。要获得key_href,您需要将 learn_more JOIN添加到 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]"