【问题标题】:Joomla 3 database SUM aggregate on a field and WHERE clause with GROUP BY plus HAVINGJoomla 3 数据库 SUM 在字段和 WHERE 子句上聚合,带有 GROUP BY 加 HAVING
【发布时间】:2014-07-26 03:20:55
【问题描述】:

我在 Joomla 中有这个查询:

$query
->select($db->quoteName(array('#__session.session_id', '#__hikashop_cart.session_id', '#__hikashop_cart.cart_id', '#__hikashop_cart_product.product_id', '#__hikashop_product.product_parent_id', '#__hikashop_cart_product.cart_product_quantity')))
->from($db->quoteName('#__hikashop_cart'))
->join('INNER', $db->quoteName('#__hikashop_cart_product') . ' ON #__hikashop_cart.cart_id = #__hikashop_cart_product.cart_id')
->join('INNER', $db->quoteName('#__hikashop_product') . ' ON #__hikashop_cart_product.product_id = #__hikashop_product.product_id')
->join('INNER', $db->quoteName('#__session') . ' ON #__hikashop_cart.session_id = #__session.session_id')
->where($db->quoteName('hady9_session.session_id').' = '.$db->quote($thesession).'AND ('.$db->quoteName('hady9_hikashop_product.product_parent_id').' = '.$db->quote('3578').'OR'.$db->quote('4482').'OR'.$db->quote('4947').'OR'.$db->quote('8047').'OR'.$db->quote('5102').'OR'.$db->quote('5257').'OR'.$db->quote('5412').'OR'.$db->quote('8202').'OR'.$db->quote('5567').'OR'.$db->quote('5722').'OR'.$db->quote('5877').'OR'.$db->quote('8357').'OR'.$db->quote('6032').'OR'.$db->quote('6187').'OR'.$db->quote('6342').'OR'.$db->quote('8512').')');

我需要改成这样的:

->select($db->quoteName(array('#__hikashop_product.product_parent_id', Sum('#__hikashop_cart_product.cart_product_quantity'))))
->from($db->quoteName('#__hikashop_cart'))
->join('INNER', $db->quoteName('#__hikashop_cart_product') . ' ON #__hikashop_cart.cart_id = #__hikashop_cart_product.cart_id')
->join('INNER', $db->quoteName('#__hikashop_product') . ' ON #__hikashop_cart_product.product_id = #__hikashop_product.product_id')
->join('INNER', $db->quoteName('#__session') . ' ON #__hikashop_cart.session_id = #__session.session_id')
->where($db->quoteName('hady9_session.session_id').' = '.$db->quote($thesession))
->groupby($db->quoteName('#__hikashop_product.product_parent_id'))
->having($db->quoteName('#__hikashop_product.product_parent_id').' = '.$db->quote('3578').'OR'.$db->quote('4482').'OR'.$db->quote('4947').'OR'.$db->quote('8047').'OR'.$db->quote('5102').'OR'.$db->quote('5257').'OR'.$db->quote('5412').'OR'.$db->quote('8202').'OR'.$db->quote('5567').'OR'.$db->quote('5722').'OR'.$db->quote('5877').'OR'.$db->quote('8357').'OR'.$db->quote('6032').'OR'.$db->quote('6187').'OR'.$db->quote('6342').'OR'.$db->quote('8512').')');

第二个的区别是:我需要 #__hikashop_cart_product.cart_product_quantity 字段上的 SUM,#__hikashop_product.product_parent_id 字段上的 GROUP BY 并使用 HAVING 条件,使用 #__hikashop_product.product_parent_id 作为一堆可能的数字。

在 phpmyadmin 中进行测试时,该查询完成了我需要它执行的操作,但我不确定在 joomla 中使用 SUM、GROUP BY 和 HAVING 部分的正确语法。

我已将此查询修改为:

$query->select($db->quoteName(array('#__hikashop_product.product_parent_id', ('sum('.$db->quoteName('#__hikashop_cart_product.cart_product_quantity').')'))));
$query->from($db->quoteName('#__hikashop_cart'));
$query->join('INNER', $db->quoteName('#__hikashop_cart_product') . ' ON #__hikashop_cart.cart_id = #__hikashop_cart_product.cart_id');
$query->join('INNER', $db->quoteName('#__hikashop_product') . ' ON #__hikashop_cart_product.product_id = #__hikashop_product.product_id');
$query->join('INNER', $db->quoteName('#__session') . ' ON #__hikashop_cart.session_id = #__session.session_id');
$query->where($db->quoteName('#__session.session_id').' = '.$db->quote($thesession));
$query->group($db->quote('#__hikashop_product.product_parent_id'));
$query->having($db->quote('#__hikashop_product.product_parent_id').' = '.$db->quote('3578').'OR'.$db->quote('4482').'OR'.$db->quote('4947').'OR'.$db->quote('8047').'OR'.$db->quote('5102').'OR'.$db->quote('5257').'OR'.$db->quote('5412').'OR'.$db->quote('8202').'OR'.$db->quote('5567').'OR'.$db->quote('5722').'OR'.$db->quote('5877').'OR'.$db->quote('8357').'OR'.$db->quote('6032').'OR'.$db->quote('6187').'OR'.$db->quote('6342').'OR'.$db->quote('8512').')');

我在 atm 收到此错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行 SQL=SELECT 的“.cart_product_quantity) FROM hady9_hikashop_cart INNER JOIN `hady9_hik”附近使用正确的语法......

任何帮助将不胜感激。

【问题讨论】:

    标签: php sql joomla


    【解决方案1】:

    只做一个普通的 $sql 查询而不使用 Joomla 的查询层。您可以通过以下方式执行此操作(以下为示例):

    $sql = "SELECT title FROM #__content WHERE id='5'";
    $db->setQuery($sql);
    $result = $db->loadAssocList();
    

    【讨论】:

    • 为什么不使用 Joomla 的数据库 API?同样使用您的方法,根本没有任何东西被逃脱
    • 如果您检查许多大型扩展的代码,您不会看到它们使用 Joomla 特定的功能,例如 ->join 和 ->select 和 ->where,因为几乎不可能进行复杂的查询这样写。
    • 感谢您的评论。我是这个东西的菜鸟。使用 joomla api(使用 Flexi 自定义代码模块将代码插入模板)是我能够获得工作所需的唯一方法。我在上面发布的第一个查询确实有效,但我意识到我还需要 SUM、GROUP BY 和 HAVING 的东西,因此是 OP 中的第二个查询。我一直在尝试使用普通/标准的 sql 查询来做一些事情,但我就是无法掌握它。
    • 许多“大型”扩展不使用 API 的事实是因为它们中的许多甚至仍在使用 1.5 或 1.0 的遗留代码。如果您正在编写新的代码,则应该使用 API 以确保可移植性和安全性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多