2016-05-29 96 views
0

查詢應如何計算此SQL中的行數。我需要準確的SQL查詢不PHP功能。使用HAVING,GROUP BY和GROUP_CONCAT對SQL進行計數

SELECT 
`main_table`.`entity_id`, 
`main_table`.`supplier_id`, 
`main_table`.`exported_at`, 
`main_table`.`created_at`, 
`main_table`.`updated_at`, 
`main_table`.`product_id`, 
`main_table`.`external_id`, 
GROUP_CONCAT(DISTINCT 
      (IF(attr.alias = 'attribute_set_name', attr_item.value, NULL)))     AS `attribute_attribute_set_name`, 
GROUP_CONCAT(DISTINCT (IF(attr.alias = 'title', attr_item.value, NULL)))      AS `attribute_title`, 
GROUP_CONCAT(DISTINCT (IF(attr.alias = 'normal_price', attr_item.value, NULL)))    AS `attribute_normal_price`, 
(SELECT SUM(IF(attr_item.value = '', 1, 0)) = 0 
FROM divante_integration_stock_attribute attr INNER JOIN divante_integration_stock_attribute_item AS attr_item 
    ON attr_item.attribute_id = attr.entity_id 
WHERE is_required = 1 AND attr_item.item_id = main_table.entity_id)       AS `is_complete`, 
(SELECT GROUP_CONCAT(attr.code) 
FROM divante_integration_stock_attribute attr INNER JOIN divante_integration_stock_attribute_item AS attr_item 
    ON attr_item.attribute_id = attr.entity_id 
WHERE is_required = 1 AND attr_item.item_id = main_table.entity_id AND attr_item.value = '') AS `not_complete_attributes`, 
`main_table`.`entity_id`, 
`cp`.`sku` 
FROM `divante_integration_stock` AS `main_table` LEFT JOIN `divante_integration_stock_attribute_item` AS `attr_item` 
ON attr_item.item_id = main_table.entity_id 
LEFT JOIN `divante_integration_stock_attribute` AS `attr` ON attr.entity_id = attr_item.attribute_id 
LEFT JOIN `catalog_product_entity` AS `cp` ON main_table.product_id = cp.entity_id 
GROUP BY `main_table`.`entity_id` 
HAVING (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'attribute_set_name', attr_item.value, NULL))) LIKE '%ebook%') AND 
    (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'title', attr_item.value, NULL))) LIKE '%sieci%') AND 
    (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'normal_price', CAST(attr_item.value AS DECIMAL(12, 4)), NULL))) BETWEEN 40 AND 999999.9999) 

回答

1

一個簡單的方法來做到這一點是隻讓整個查詢的子查詢,包裹着SELECT Count(1) FROM();

SELECT Count(1) 
FROM 
(
    SELECT 
    `main_table`.`entity_id`, 
    `main_table`.`supplier_id`, 
    `main_table`.`exported_at`, 
    `main_table`.`created_at`, 
    `main_table`.`updated_at`, 
    `main_table`.`product_id`, 
    `main_table`.`external_id`, 
    GROUP_CONCAT(DISTINCT 
       (IF(attr.alias = 'attribute_set_name', attr_item.value, NULL)))     AS `attribute_attribute_set_name`, 
    GROUP_CONCAT(DISTINCT (IF(attr.alias = 'title', attr_item.value, NULL)))      AS `attribute_title`, 
    GROUP_CONCAT(DISTINCT (IF(attr.alias = 'normal_price', attr_item.value, NULL)))    AS `attribute_normal_price`, 
    (SELECT SUM(IF(attr_item.value = '', 1, 0)) = 0 
    FROM divante_integration_stock_attribute attr INNER JOIN divante_integration_stock_attribute_item AS attr_item 
     ON attr_item.attribute_id = attr.entity_id 
    WHERE is_required = 1 AND attr_item.item_id = main_table.entity_id)       AS `is_complete`, 
    (SELECT GROUP_CONCAT(attr.code) 
    FROM divante_integration_stock_attribute attr INNER JOIN divante_integration_stock_attribute_item AS attr_item 
     ON attr_item.attribute_id = attr.entity_id 
    WHERE is_required = 1 AND attr_item.item_id = main_table.entity_id AND attr_item.value = '') AS `not_complete_attributes`, 
    `main_table`.`entity_id`, 
    `cp`.`sku` 
    FROM `divante_integration_stock` AS `main_table` LEFT JOIN `divante_integration_stock_attribute_item` AS `attr_item` 
    ON attr_item.item_id = main_table.entity_id 
    LEFT JOIN `divante_integration_stock_attribute` AS `attr` ON attr.entity_id = attr_item.attribute_id 
    LEFT JOIN `catalog_product_entity` AS `cp` ON main_table.product_id = cp.entity_id 
    GROUP BY `main_table`.`entity_id` 
    HAVING (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'attribute_set_name', attr_item.value, NULL))) LIKE '%ebook%') AND 
     (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'title', attr_item.value, NULL))) LIKE '%sieci%') AND 
     (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'normal_price', CAST(attr_item.value AS DECIMAL(12, 4)), NULL))) BETWEEN 40 AND 999999.9999) 
); 
1

你可以用COUNT做到這一點:

SELECT COUNT(*) FROM (
    //your sql 
); 

所以你只需換另一種選擇其中你算在你的實際選擇的行。

所以你的情況:

SELECT COUNT(*) FROM (
    SELECT 
    `main_table`.`entity_id`, 
    `main_table`.`supplier_id`, 
    `main_table`.`exported_at`, 
    `main_table`.`created_at`, 
    `main_table`.`updated_at`, 
    `main_table`.`product_id`, 
    `main_table`.`external_id`, 
    GROUP_CONCAT(DISTINCT 
       (IF(attr.alias = 'attribute_set_name', attr_item.value, NULL)))     AS `attribute_attribute_set_name`, 
    GROUP_CONCAT(DISTINCT (IF(attr.alias = 'title', attr_item.value, NULL)))      AS `attribute_title`, 
    GROUP_CONCAT(DISTINCT (IF(attr.alias = 'normal_price', attr_item.value, NULL)))    AS `attribute_normal_price`, 
    (SELECT SUM(IF(attr_item.value = '', 1, 0)) = 0 
    FROM divante_integration_stock_attribute attr INNER JOIN divante_integration_stock_attribute_item AS attr_item 
     ON attr_item.attribute_id = attr.entity_id 
    WHERE is_required = 1 AND attr_item.item_id = main_table.entity_id)       AS `is_complete`, 
    (SELECT GROUP_CONCAT(attr.code) 
    FROM divante_integration_stock_attribute attr INNER JOIN divante_integration_stock_attribute_item AS attr_item 
     ON attr_item.attribute_id = attr.entity_id 
    WHERE is_required = 1 AND attr_item.item_id = main_table.entity_id AND attr_item.value = '') AS `not_complete_attributes`, 
    `main_table`.`entity_id`, 
    `cp`.`sku` 
    FROM `divante_integration_stock` AS `main_table` LEFT JOIN `divante_integration_stock_attribute_item` AS `attr_item` 
    ON attr_item.item_id = main_table.entity_id 
    LEFT JOIN `divante_integration_stock_attribute` AS `attr` ON attr.entity_id = attr_item.attribute_id 
    LEFT JOIN `catalog_product_entity` AS `cp` ON main_table.product_id = cp.entity_id 
    GROUP BY `main_table`.`entity_id` 
    HAVING (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'attribute_set_name', attr_item.value, NULL))) LIKE '%ebook%') AND 
     (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'title', attr_item.value, NULL))) LIKE '%sieci%') AND 
     (GROUP_CONCAT(DISTINCT (IF(attr.alias = 'normal_price', CAST(attr_item.value AS DECIMAL(12, 4)), NULL))) BETWEEN 40 AND 999999.9999) 
);