web-dev-qa-db-ja.com

未加工のSQLクエリは複数の行を返しますが、Joomlaメソッドでは1行のみが返されます

何らかの理由でDBに直接置いたクエリは機能しますが、Joomla構文で設定すると、結果が1つだけ返され、さらに多くの結果が得られるはずです...

Mysqlクエリをクリア:

_SELECT 
vmp.virtuemart_product_id as 'product_id',
vmp.product_parent_id as 'parent_id',
vmp.product_sku as 'sku',
vmp.product_in_stock as 'stock',
vmp.published as 'published',
pc.virtuemart_category_id as "category"
FROM `mus_virtuemart_products` as vmp
JOIN mus_virtuemart_product_categories as pc ON pc.virtuemart_product_id=vmp.product_parent_id
WHERE vmp.product_parent_id>0 AND pc.virtuemart_category_id=105;
_

Joomlyクエリ:

_$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array(
                    'vmp.virtuemart_product_id as product_id',
                    'vmp.product_parent_id as parent_id',
                    'vmp.product_sku as sku',
                    'vmp.product_in_stock as stock',
                    'vmp.published as published',
                    'pc.virtuemart_category_id as category'
                    ))
      ->from($db->quoteName('#__virtuemart_products','vmp'))
      ->join('INNER', $db->quoteName('#__virtuemart_product_categories','pc') . 
        ' ON (' . $db->quoteName('pc.virtuemart_product_id') . ' = ' . $db->quoteName('vmp.virtuemart_product_id') . ')')        
      ->where($db->quoteName('pc.virtuemart_category_id') . ' = '. $db->quote($category). ' AND '. $db->quoteName('vmp.product_parent_id') . ' >0');
$db->setQuery($query);
$podaci = $db->loadAssocList();

_

さまざまな組み合わせを試しましたが、常に1つの結果しか得られません。私は問題をWHERE句の1つの条件に制限したと思います:

_->where($db->quoteName('vmp.product_parent_id') . ' >0');  
_

「ゼロ」を$db->quote($zero) where _$zero="0"_に設定しようとしましたが、何も変更しませんでした。


アップデート1

コードを数回繰り返した後、エラーが発生し始めました。

SQL構文にエラーがあります。 MariaDBサーバーのバージョンに対応するマニュアルで、3行目付近の ''の近くで使用する正しい構文を確認してください

where条件を$db->quoteName('pc.virtuemart_category_id') . ' = '. $db->quote($category)のみに変更すると、クエリは正常に機能します。

1
Oktarin

クエリにエラーが見つかりました。

元の:

JOIN mus_virtuemart_product_categories as pc ON pc.virtuemart_product_id=vmp.product_parent_id

Joomlaクエリ:

->join('INNER', $db->quoteName('#__virtuemart_product_categories','pc') . 
    ' ON (' . $db->quoteName('pc.virtuemart_product_id') . ' = ' . $db->quoteName('vmp.virtuemart_product_id') . ')')
  • 最後の列参照を置き換える必要があります。

の代わりに vmp.virtuemart_product_id そのはず vmp.product_parent_id

したがって、最終的な正しいクエリは次のとおりです。

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array(
                    'vmp.virtuemart_product_id as product_id',
                    'vmp.product_parent_id as parent_id',
                    'vmp.product_sku as sku',
                    'vmp.product_in_stock as stock',
                    'vmp.published as published',
                    'pc.virtuemart_category_id as category'
                    ))
      ->from($db->quoteName('#__virtuemart_products','vmp'))
      ->join('INNER', $db->quoteName('#__virtuemart_product_categories','pc') . 
        ' ON (' . $db->quoteName('pc.virtuemart_product_id') . ' = ' . $db->quoteName('vmp.product_parent_id') . ')')        
      ->where($db->quoteName('pc.virtuemart_category_id') . ' = '. $db->quote($category). ' AND '. $db->quoteName('vmp.product_parent_id') . ' >0');
$db->setQuery($query);
$podaci = $db->loadAssocList();
2
Oktarin