2016-07-18 3 views
-1

내 라이브 데이터베이스 (MariaDB)가 로컬 (MySQL)과 완전히 동일한 데이터를 가지고 있지만 다음 쿼리가 동일한 결과를 다른 순서로 반환하는 문제가 있습니다. 하지 SQL에서 최고의 그래서 나는) 미리 사과 것이다 :동일한 데이터베이스의 다른 결과

SELECT 
    `products`.* 
    , CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) AS `order_date` 
    , `category_product`.`category_id` AS `pivot_category_id` 
    , `category_product`.`product_id` AS `pivot_product_id` 
    , `count_activate`.`active_count` 
    , IF(`count_activate`.`product_id` > 0, 0, 1) AS coming_soon 
FROM 
    `products` 
    INNER JOIN 
     `category_product` 
    ON 
     `products`.`id` = `category_product`.`product_id` 
    LEFT JOIN 
    (
     SELECT 
      inventory.* 
     FROM 
      inventory 
     INNER JOIN 
      `booking_inventory` 
     ON 
      `inventory`.`id` = `booking_inventory`.`inventory_id` 
     WHERE 
      CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) > NOW() 
     ORDER BY 
      DATE(CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00'))) 
    ) 
    AS 
     inventory 
    ON 
     `products`.`id` = `inventory`.`product_id` 
    INNER JOIN 
     `booking_inventory` 
    ON 
     `inventory`.`id` = `booking_inventory`.`inventory_id` 
    LEFT JOIN 
    (
     SELECT 
      COUNT(inventory.id) AS active_count 
      , product_id 
     FROM 
      inventory 
     INNER JOIN 
      `booking_inventory` 
     ON 
      `inventory`.`id` = `booking_inventory`.`inventory_id` 
     WHERE 
      status_id = 1 
     AND 
     (
      stock > 0 
      OR stock = -1 
     ) 
     AND 
      CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) > NOW() 
     GROUP BY 
      product_id 
    ) 
    AS 
     count_activate 
    ON 
     `count_activate`.`product_id` = `products`.`id` 
    WHERE 
     `category_product`.`category_id` = 2 
    AND EXISTS 
    (
     SELECT 
      * 
     FROM 
      `sites` 
     INNER JOIN 
      `product_site` 
     ON 
      `sites`.`id` = `product_site`.`site_id` 
     WHERE 
      `product_site`.`product_id` = `products`.`id` 
     AND 
      `status_id` = 1 
     AND 
      `site_id` = 1 
    ) 
    AND 
     `products`.`status_id` = 1 
    AND 
     CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) > NOW() 
    GROUP BY 
     `products`.`id` 
    ORDER BY 
      `coming_soon` ASC 
     , `order_date` ASC 

    LIMIT  100 
    OFFSET 0 

사람이를 일으키는 원인을 말해 줄 수?

관련

enter image description here

편집 아래의 바보의 의견과 아래 투표, 매우 도움에 대한

감사 (왼쪽 ID를 외부 권리는 지역입니다) ... 약간 파기 후에, 나는 원인을 그러나 아직 응답 찾아 내지 않았다. 두 번째 JOIN (인벤토리)에서 날짜 순서가 동일한 결과를 반환하지 않습니다. 인벤토리 ID, 가격, SKU로 주문한 경우 로컬 및 외부 데이터에서 동일한 결과를 얻지 만 날짜를 사용하지는 않습니다. 이유를 아는 사람이 있습니까?

안부

+0

큰 쿼리를 한 번 다시 정렬 할 수 없습니까? – Whencesoever

+0

차이점을 보여주기 위해 몇 가지 샘플 출력을 제공 할 수 있습니까? mariadb 버전이 동일합니까? – Shadow

+0

질문에 이미지를 추가했습니다. –

답변

0

문제는 버전/dbengine에 있습니다. 첫 번째 왼쪽 조인에는 순서가 있습니다.이 순서는 부모 (버전/dbengine에 따라 다름)에서 한 번 사용하지 않은 것을 인식하지 못합니다.

이 문제를 극복하는 한 가지 방법은 결과를 임시 테이블 (또는 내가 말한 것이 무엇인지 알지 못하는 것)에 저장하도록 강제하는 18446744073709551615의 한계를 설정하는 것입니다.

다른 문제는 테이블을 다시 정렬하도록 강제 된 쿼리의 내부 조인에 더 가깝습니다.

SELECT 
    IF(`counter`.`product_id` > 0, 0, 1) AS coming_soon, 
    bd.skill_level, 
    counter.active_count, 
    p.* 
FROM 
(
    SELECT 
     p.*, 
     booking_inventory.inventory_id, 
     category_product.category_id, 
     CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) as date 
    FROM 
     booking_inventory 
    JOIN 
     inventory 
    ON 
     inventory.id = booking_inventory.inventory_id 
    LEFT JOIN 
     products AS p 
    ON 
     p.id = inventory.product_id 
    INNER JOIN 
      `category_product` 
     ON 
      `p`.`id` = `category_product`.`product_id` 
    WHERE 
     CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) > NOW() 
    AND 
     `category_product`.`category_id` = 2 
    ORDER BY 
     date 
    LIMIT 
     18446744073709551615 

) 
AS 
    p 
LEFT JOIN 
    booking_data AS bd 
ON 
    p.id = bd.product_id 
LEFT JOIN 
(
    SELECT 
     COUNT(`inventory`.`id`) AS `active_count`, 
     `inventory`.`product_id` 
    FROM 
     `inventory` 
    INNER JOIN 
     `booking_inventory` 
    ON 
     `inventory`.`id` = `booking_inventory`.`inventory_id` 
    WHERE 
     `inventory`.`status_id` = 1 
    AND 
    (
     `inventory`.`stock` > 0 
      OR 
     `inventory`.`stock` = -1 
    ) 
    AND 
     CONCAT(`booking_inventory`.`year`, '-', LPAD(`booking_inventory`.`month`, 2, '00'), '-', LPAD(`booking_inventory`.`day`, 2, '00')) > NOW() 
    GROUP BY 
     `inventory`.`product_id` 
) 
AS 
    counter 
ON 
     `counter`.`product_id` = `p`.`id` 
WHERE 
EXISTS 
    (
    SELECT 
     * 
    FROM 
     `sites` 
    INNER JOIN 
     `product_site` 
    ON 
     `sites`.`id` = `product_site`.`site_id` 
    WHERE 
     `product_site`.`product_id` = `p`.`id` 
    AND 
     `status_id` = 1 
    AND 
     `site_id` = 1 
    ) 

GROUP BY 
    p.id 
ORDER BY 
    coming_soon, 
    p.date, 
    p.name 
관련 문제