mysql - 使用 INNER JOIN 的 SQL 查询无法正确排序。

标签 mysql inner-join

我创建了以下 SQL 查询以从数据库中导出订单数据。

SELECT orders.orders_id as uuid,
        orders.customers_id as order__customer_id,
        orders.customers_name as order__customer_name,
        orders.customers_company as order__customer_company,
        orders.customers_street_address as order__customer_street_address,
        orders.customers_suburb as order__customer_suburb,
        orders.customers_city as order__customer_city,
        orders.customers_postcode as order__customer_postcode,
        orders.customers_state as order__customer_state,
        orders.customers_country as order__customer_country,
        orders.customers_telephone as order__customer_telephone,
        orders.customers_email_address as order__customer_email_address,
        orders.delivery_name as order__delivery_name,
        orders.delivery_company as order__delivery_company,
        orders.delivery_street_address as order__delivery_street_address,
        orders.delivery_suburb as order__delivery_suburb,
        orders.delivery_city as order__delivery_city,
        orders.delivery_postcode as order__delivery_postcode,
        orders.delivery_state as order__delivery_state,
        orders.delivery_country as order__delivery_country,
        orders.billing_name as order__billing_name,
        orders.billing_company as order__billing_company,
        orders.billing_street_address as order__billing_street_address,
        orders.billing_suburb as order__billing_suburb,
        orders.billing_city as order__billing_city,
        orders.billing_postcode as order__billing_postcode,
        orders.billing_state as order__billing_state,
        orders.billing_country as order__billing_country,
        orders.payment_method as order__payment_method,
        orders.last_modified as order__last_modified,
        orders.date_purchased as order__date_purchased,
        orders.orders_status as order__order_status,
        orders_status.orders_status_name as order__order_status_name,
        orders.orders_date_finished as order__date_finished,
        orders.currency as order__currency,
        orders.currency_value as order__currency_value,
        ot1.orders_id,
        value AS ot_subtotal,
        ot2.ot_shipping,
        ot3.ot_total
        FROM orders, orders_status, orders_total as ot1 
        INNER JOIN ( SELECT orders_id, value AS ot_shipping FROM orders_total WHERE class='ot_shipping' ) AS ot2 ON ot1.orders_id=ot2.orders_id AND ot1.class='ot_subtotal' 
        INNER JOIN ( SELECT orders_id, value AS ot_total FROM orders_total WHERE class='ot_total' ) AS ot3 ON ot1.orders_id=ot3.orders_id AND ot1.class='ot_subtotal'
        WHERE ot1.orders_id = ot2.orders_id and orders.orders_status = orders_status.orders_status_id;

除了为每条记录创建 4 行外,它的效果非常好。当前有 4 个订单,所以有 16 行(包括列名 17 行),而应该只有 4 行(包括列名 5 行)。

谢谢!

当它应该只有 4 行(5 包括列名)时,因为只有 4 个订单。

非常感谢!

最佳答案

您似乎缺少任何将 orders 链接到 orders_totalJOIN。如果您使用显式 JOIN 语法重写而不是混合新旧样式,这会更清楚。

FROM   orders
       INNER JOIN orders_status ON orders.orders_status = orders_status.orders_status_id
       INNER JOIN orders_total as ot1 /*<--Missing Condition here
                                          ON orders.orders_id = ot1.orders_id */
       INNER JOIN (SELECT orders_id,
                          value AS ot_shipping
                   FROM   orders_total
                   WHERE  class = 'ot_shipping') AS ot2
         ON ot1.orders_id = ot2.orders_id
       INNER JOIN (SELECT orders_id,
                          value AS ot_total
                   FROM   orders_total
                   WHERE  class = 'ot_total') AS ot3
         ON ot1.orders_id = ot3.orders_id

无论如何,您不需要为此在同一张 table 上加入 3 次。您可以使用类似下面的内容。

SELECT orders.orders_id,
       MAX(CASE
             WHEN orders_total.class = 'ot_subtotal' THEN value
           END) AS ot_subtotal,
       MAX(CASE
             WHEN orders_total.class = 'ot_shipping' THEN value
           END) AS ot_shipping,
       MAX(CASE
             WHEN orders_total.class = 'ot_total' THEN value
           END) AS ot_total
FROM   orders
       INNER JOIN orders_status
         ON orders.orders_status = orders_status.orders_status_id
       INNER JOIN orders_total
         ON orders_total.orders_id = orders.orders_id
WHERE  orders_total.class in ( 'ot_subtotal', 'ot_shipping', 'ot_total' )
GROUP  BY orders.orders_id  

关于mysql - 使用 INNER JOIN 的 SQL 查询无法正确排序。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6879345/

相关文章:

c# - 如何内部连接来自不同数据上下文的表?

mysql - vagrant sequel pro SSH 隧道远程主机无法连接,密码错误

mysql - 溶解第二个选择语句

php - 在 PHP/MySQL 中上传有大小限制的图像

subsonic - 亚音速内连接

mysql - 如果在 LEFT JOIN 和 WHERE 子句中找不到结果,如何在 MySQL 查询中返回 NULL 值

php - MySQL 和 PHP foreach 中的行总和

php - Dompdf 错误 : "The Row #4 could not be found" when converting PHP file to PDF

php - 允许用户使用 php mysql 在三种类型之间进行选择的搜索页面

mysql - MySQL INNER JOIN ON 的正确顺序语法(Basic Q)