Mysql从指向同一个表的多个外键中选择数据

时间:2017-07-15 16:01:08

标签: php mysql foreign-keys

我有两张桌子:

模块:

+-------------+---------+
| 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字段的值?

许多其他答案只有一个外键或不同表中的外键。

编辑:有些文字被多次使用。

1 个答案:

答案 0 :(得分:0)

使用此设计,您必须为每个映射文本字段加入texts表一次。在您的情况下,对于titledescription,它将是:

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。