【发布时间】:2011-01-25 18:08:42
【问题描述】:
我有一个在 PhpMyAdmin/MySQL Workbench 中工作的 MySQL 查询。
SELECT *
FROM (`medfacts`)
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
where title in (
select medfacts.title from medfacts
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
where categories_medfacts.category_id = 2
)
or title in (
select medfacts.title from medfacts
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
where categories_medfacts.category_id = 3
)
(查询获取连接表 categories_medfacts 中列出的具有给定类别 ID 的所有 medfacts。)
我现在需要将它转移到我的 CodeIgniter 项目中,以允许我的程序根据需要添加尽可能多的 Have 子句。到目前为止,我所生成的查询大多是正确的。
function list_by_category($cat, $module) {
/* Get a list of the Medfacts entries that have this category. *
*/
$this->db->join('categories_medfacts', 'categories_medfacts.medfact_id = medfacts.id');
$this->where('medfacts.module_id', $module);
/* If the category is an array, just get the articles that fall under all categories.
* This shouldn't be more than a handful deep.
*/
if (is_array($cat)) {
foreach ($cat as $field => $value) {
$this->where_in('title', "select medfacts.title from medfacts JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id` where categories_medfacts.category_id = {$value}");
}
} else {
$this->where('categories_medfacts.category_id', $cat);
}
$this->select('medfacts.title');
return $this->get();
}
但是,我无法让它不逃避嵌套的 Select 语句,并最终得到以下结果:
SELECT `medfacts`.`title`
FROM (`medfacts`)
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
WHERE (
`medfacts`.`module_id` = '2'
AND `medfacts`.`title` IN ('select medfacts.title from medfacts JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id` where categories_medfacts.category_id = 2')
AND `medfacts`.`title` IN ('select medfacts.title from medfacts JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id` where categories_medfacts.category_id = 3')
)
AND `medfacts`.`site_id` = 1
注意 where in 子句中嵌套 select 周围的引号。
有没有办法让 Datamapper 不逃避嵌套选择?或者,有没有更好的方法来实现相同的目标?还是我坚持自己编写查询?
我在 PHP5 服务器上使用 CI 1.7.2 和 Datamapper DMZ 1.7.1(目前无法更新)。
编辑:我知道一个简单的or where 会返回匹配每个where 大小写的文章。然而,这不是我需要的。我只需要属于所有给定类别的结果。使用我当前的设置,or where 返回的结果太多(包括仅属于列出的类别之一的结果),而and where 不返回任何内容(也永远不会返回,因为 category_id 不能同时是“2”和“3”)。
另外,我发现了一个JOIN,如下面的也适用于MySQL,但我也不能将它翻译成CI(我没有发布它,因为我认为上面的where in是更清洁的方法) .
SELECT *
FROM (`medfacts`)
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
join (
select medfacts.title, medfacts.id from medfacts
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
where categories_medfacts.category_id = 2
) m1
on m1.id = medfacts.id
join (
select medfacts.title, medfacts.id from medfacts
JOIN `categories_medfacts` ON `categories_medfacts`.`medfact_id` = `medfacts`.`id`
where categories_medfacts.category_id = 3
) m2
on m2.id = medfacts.id
where `medfacts`.`module_id` = '2'
and medfacts.site_id = 1
【问题讨论】:
-
哇!我还没有读过这个问题,但你正在做多个子查询并加入只是为了匹配多个类别 ID
categories_medfacts.category_id?!我建议您询问如何优化该查询! -
也许您应该阅读这个问题,那么?我确实问过是否有更好的方法来达到同样的效果。
-
这个查询会返回什么:
SELECT * FROM medfacts,categories_medfacts WHERE categories_medfacts.medfact_id = medfacts.id AND categories_medfacts.category_id IN (2,3) -
ifaour:记录太多。我只需要同时归类为 2 类和 3 类的记录,而不是 2 类或 3 类。您的查询获取匹配 2 类或 3 类的记录。
标签: php mysql codeigniter