我有两张桌子:
模块:
+-------------+---------+
| Field | Type |
+-------------+---------+
| id | int(11) |
| title | int(11) | <- foreign key to texts
| description | int(11) | <- foreign key to texts
| goal | int(11) | <- foreign key to texts
| sp1 | int(11) | <- foreign key to texts
| sp2 | int(11) | <- foreign key to texts
+-------------+---------+
文本:
+---------+--------------+
| Field | Type |
+---------+--------------+
| id | int(11) |
| name | varchar(100) |
| text | text |
| is_html | tinyint(1) |
+---------+--------------+
有了这个:
SELECT modules.title, modules.description from modules;
我只从texts
获得该行的ID。
如何从text
查询texts
字段的值?
许多其他答案只有一个外键或不同表中的外键。
编辑:有些文字被多次使用。
答案 0 :(得分:0)
使用此设计,您必须为每个映射文本字段加入texts
表一次。在您的情况下,对于title
和description
,它将是:
SELECT title.text as title, descr.text as description
FROM modules
JOIN texts as title on title.id = modules.title
JOIN texts as descr on descr.id = modules.description
如果此类查询的数量有限,则可能没问题。但如果你有很多,我会重新考虑设计。
但是,如果您有充分的理由进行此设计,请考虑使用缓存texts
表的数组在PHP中映射文本。
例如:每次更新texts
表时,都会获取数据并将其存储在cache/texts.php
等缓存文件中,该文件看起来像
<?php
const TEXTS = array(
1 => 'some title',
2 => 'some description',
// ...
);
然后你可以写一个像
这样的函数function getText($textId) {
require_once 'cache/texts.php';
return TEXTS[$textId];
}
并像
一样使用它echo '<td>' . getText($row[title]) . '</td>';
或者使用模板引擎,它看起来像
<td>{{ module.title|getText }}</td>
<td>{{ module.description|getText }}</td>
这可能不是最好的解决方案。但它很简单,可以在SQL中为你节省很多JOIN。