Joomla 3数据库在字段和WHERE子句上使用groupby + HAVING进行SUM聚合


Joomla 3 database SUM aggregate on a field and WHERE clause with GROUP BY plus HAVING

我在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进行SUM。cart_product_quantity字段,对#__hikashop_product进行GROUP BY。product_parent_id字段,使用#__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').')');

我现在得到这个错误:

1064 -你有一个错误的SQL语法;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,在' . cart_product_quantity ) FROM hady9_hikashop_cart INNER JOIN ' hady9_hik'在第一行SQL=SELECT......

只需执行普通的$sql查询,而不使用Joomla的查询层。你可以这样做(下面是一个例子):

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