来自相同数据库的不同结果

时间:2016-07-18 11:41:15

标签: mysql sql

我遇到的问题是我的实时数据库(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

(左侧外部右侧是本地)

修改

感谢下面的愚蠢评论和投票,非常有帮助....经过一番挖掘,我找到了原因但不是答案。在第二个JOIN(库存)中,日期排序不会返回相同的结果。如果我按照库存ID,价格,SKU订购,我会在本地和外部数据中获得相同的结果,但不会使用日期......有人知道为什么会这样做吗?

问候

1 个答案:

答案 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