为多个值编写一个SQL查询

时间:2014-10-26 16:03:12

标签: 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。如果选择了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。有没有办法对所有类别进行一次查询?

3 个答案:

答案 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的引用。