mysql - 为多个值编写一个 SQL 查询

标签 mysql sql select prepared-statement

我正在为论坛创建一个简单的数据库。我有一个类别表 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/

相关文章:

r - 通过匹配给定因子水平的变量/列选择数据框中的变量/列

mysql - SQL 选择最符合标准的 10 条记录集

mysql - 计算并最小化行大小以绕过有效的 MySQL 列限制

mysql - MYSQL中LIKE和=的区别?

sql - 我该怎么做 Pivot(转置)

sql - 子过程过程是否可以锁定并修改其调用过程已锁定的相同行进行更新?

mysql - 如何返回其他表中满足条件的所有唯一条目?

mysql - 在 Heroku 上使用 Jaws Maria DB 的 Laravel 应用程序出现 MYSQL 错误

mysql - Mysql 中的 order by 子句

c# - 为什么在我不使用 int 时将错误 : Can't convert System. Int32 发送到 System.String?