我正在为论坛创建一个简单的数据库。我有一个类别表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。如果选择了category2,我只想要显示主题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。有没有办法对所有类别进行一次查询?
答案 0 :(得分:0)
请尝试以下方法:
SELECT *
FROM forum_categories fc
JOIN forum_topics ft
ON fc.cat_id = ft.cat_id
WHERE fc.cat_id = 1 -- or whatever category you want
ORDER
BY ft.topic_date DESC
答案 1 :(得分:0)
SELECT
cat_title,
cat_desc,
topic_title,
topic_desc
FROM forum_categories
INNER JOIN forum_topics
USING(cat_id)
WHERE cat_id = x;
答案 2 :(得分:0)
如果要创建为所有类别提取此数据的查询,可以在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的引用。