警告:
请不要使用mysql_*
函数来编写新代码。它们不再被维护并且社区已经开始了弃用过程。看到红框了吗?
相反,您应该了解准备好的语句并使用PDO或MySQLi。本文应该提供一些有关决定使用哪个 API 的详细信息。对于 PDO,这里有一个很好的教程。
考虑以下数据库设置:
-- This contains the elements: books, videos, albums.
CREATE TABLE IF NOT EXISTS `entries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`comment` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- This contains what our users favourited.
-- row_id: row identifier index
-- name: the name of the user to search for
-- entry_id: the id of the entry we search for, this will
-- make our JOIN relation towards entries.id
CREATE TABLE IF NOT EXISTS `favorites` (
`row_id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`entry_id` int(10) NOT NULL,
PRIMARY KEY (`row_id`)
) ENGINE=InnoDB;
当然放入一些任意数据:
INSERT INTO `entries` (`id`, `name`, `comment`) VALUES
(1, 'Foobar', 'Bazqux'),
(2, 'Barbaz', 'Quxfoo');
INSERT INTO `favorites` (`row_id`, `name`, `entry_id`) VALUES
(1, 'someguy', 1),
(2, 'someguy', 2),
(3, 'person', 2);
我们将需要一个基本脚本来查询我们的数据库:
mysql_connect("localhost", "username", "password");
mysql_select_db("database");
$result = mysql_query('SELECT entries.id, entries.name, entries.comment
FROM entries
INNER JOIN favorites ON entries.id = favorites.entry_id
WHERE favorites.name = "' .mysql_real_escape_string($_GET['name']). '"');
while ( $row = mysql_fetch_assoc($result) )
var_dump($row);
mysql_close();
如果我们给出$_GET['name']
的值someguy
,我们的结果将是:
array (
'id' => '1',
'name' => 'Foobar',
'comment' => 'Bazqux',
)
array (
'id' => '2',
'name' => 'Barbaz',
'comment' => 'Quxfoo',
)
而使用 的值person
,我们只会得到:
array (
'id' => '2',
'name' => 'Barbaz',
'comment' => 'Quxfoo',
)
诀窍在于INNER JOIN
. 我们的搜索模式,WHERE
子句告诉数据库我们搜索输入的favorites.entry_id
位置favorites.name
。从那里开始,JOIN
这两个表之间的链接扩展了我们的搜索。INNER JOIN
意味着只有那些与 .entries.id
相等的行才会被返回favorites.entry_id
。当然,我们会获取SELECT
语句中列出的字段。毕竟,这是我们告诉数据库要做的事情。 还有一些,视觉解释。
从这里,在while(){}
构造内部,您可以对检索到的数据做任何您想做的事情。
无需获取所有 ID,然后将其插入到field IN (value1, value2)
语句中,而是INNER JOIN
利用 MySQL 的关系结构,从而获得更好的性能和可维护性。
正如我在与另一个人讨论类似问题时所说的那样:
您可以使用 MySQL 构建的复杂性有时可能超出想象。底线是,首先您需要确保您的数据库建模正确。在那之后,这只是你如何将一个字段链接到另一个字段的问题。phpMyAdmin、LibreOffice Base 或 Microsoft Access 等工具可以极大地帮助图形界面对键之间的关系进行建模。