我正在为论坛创建一个简单的数据库。我有一个类别表 forum_categories
,如下所示:
`cat_id` INT(8) NOT NULL AUTO_INCREMENT,
`cat_title` VARCHAR(255) NOT NULL,
`cat_desc` TEXT NOT NULL,
PRIMARY KEY (`cat_id`),
UNIQUE KEY (`cat_title`)
还有一个主题表forum_topics
,如下所示:
`topic_id` INT(8) NOT NULL AUTO_INCREMENT,
`cat_id` INT(8) NOT NULL COMMENT 'foreign key with forum_categories table',
`user_id` INT(11) NOT NULL COMMENT 'foreign key with users table',
`topic_title` VARCHAR(255) NOT NULL,
`topic_desc` TEXT NOT NULL,
`topic_date` DATETIME DEFAULT NULL,
PRIMARY KEY (`topic_id`),
FOREIGN KEY (`cat_id`) REFERENCES forum_categories (`cat_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='forum topics';
现在,当我选择一个类别时,我只想显示主题,其中 cat_id 字段彼此相等。
例子:
类别 1 有 cat_id = 1
类别 2 有 cat_id = 2
主题 1 的 cat_id = 1
主题 2 的 cat_id = 2
现在,当选择类别 1 时,我只想显示主题 1。如果选择类别 2,我只想显示主题 2。
此查询实现了:
SELECT *
FROM forum_categories fc
JOIN forum_topics ft ON fc.cat_id = ft.cat_id
WHERE fc.cat_id = 1
ORDER BY ft.topic_date DESC
现在,如果可能的话,我不希望每个类别都有一个查询。尝试这样做:
SELECT *
FROM forum_categories fc
JOIN forum_topics ft ON fc.cat_id = ft.cat_id
WHERE fc.cat_id = ft.cat_id
ORDER BY ft.topic_date DESC
或者这个:
SELECT *
FROM forum_categories fc
JOIN forum_topics ft ON fc.cat_id = ft.cat_id
ORDER BY ft.topic_date DESC
在两个类别中显示主题 1 和 2。有没有一种方法可以对所有类别进行一次查询?
最佳答案
如果你想创建一个查询来提取所有类别的数据,你可以将两个表连接在一起,条件是 cat_id 相等。这看起来像这样:
SELECT *
FROM forum_categories fc
JOIN forum_topics ft ON fc.cat_id = ft.cat_id
ORDER BY ft.topic_date DESC;
如果你想查询一个特定的类别,你可以把它放在你的 WHERE 语句中,像这样:
SELECT *
FROM forum_categories fc
JOIN forum_topics ft ON fc.cat_id = ft.cat_id
WHERE fc.cat_id = 1 // Or whatever you want.
ORDER BY ft.topic_date DESC;
我认为您可能遇到的一个问题是您希望它可以重复使用,您可以在其中编写一个查询并根据需要更改 cat_id。如果是这种情况,我建议您查看准备好的语句。
准备好的语句的作用是创建一个查询,其中包含您根据需要插入的参数值。这是一个例子:
PREPARE stmnt FROM
'SELECT *
FROM forum_categories fc
JOIN forum_topics ft ON fc.cat_id = ft.cat_id
WHERE fc.cat_id = ?
ORDER BY ft.topic_date DESC';
SET @a = 1;
EXECUTE stmnt USING @a;
执行此操作时,您可以随心所欲地分配一个新变量(@b、@c)。您所要做的就是每次调用 EXECUTE stmnt
,而不必总是重写该查询。
这是一个 SQL Fiddle这涵盖了我为您提供的所有三个示例。
这是对 MySQL 的引用 prepared statements .
关于mysql - 为多个值编写一个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574947/