JOIN查询中的混淆

时间:2014-02-06 09:32:29

标签: mysql sql

  SELECT i.invoice_date inv, 
         i.invoice_id, 
         i.total_amount, 
         oi.invoice_date oi_inv, 
         oi.offline_invoice_number, 
         oi.invoice_amount 
    FROM ci_invoices i 
              LEFT JOIN ci_offline_invoice oi 
                        ON oi.customer_id = 9 
   WHERE i.customer_id = 9 
ORDER BY i.invoice_date 
   LIMIT 10

此查询提供结果

enter image description here

正如您在屏幕截图中看到的,我在突出显示的部分中只有一行,我想根据日期得到结果:

2014-02-03
2014-01-16
2014-01-16
2014-01-16
2014-01-16
2014-01-16
..........

但我每次都获得2014-02-03日期(限制10)

2 个答案:

答案 0 :(得分:0)

试试这个

SELECT i.invoice_date inv, 
         i.invoice_id, 
         i.total_amount, 
         oi.invoice_date oi_inv, 
         oi.offline_invoice_number, 
         oi.invoice_amount 
    FROM ci_invoices i 
              LEFT JOIN ci_offline_invoice oi 
                        ON oi.customer_id = i.customer_id
   WHERE i.customer_id = 9 
ORDER BY i.invoice_date 
   LIMIT 10

**编辑**

他们不是一回事。

考虑以下问题:

SELECT i.invoice_date inv, 
         i.invoice_id, 
         i.total_amount, 
         oi.invoice_date oi_inv, 
         oi.offline_invoice_number, 
         oi.invoice_amount 
    FROM ci_invoices i 
              LEFT JOIN ci_offline_invoice oi 
                        ON oi.customer_id = i.customer_id
   WHERE i.customer_id = 9 
ORDER BY i.invoice_date 
   LIMIT 10

SELECT i.invoice_date inv, 
         i.invoice_id, 
         i.total_amount, 
         oi.invoice_date oi_inv, 
         oi.offline_invoice_number, 
         oi.invoice_amount 
    FROM ci_invoices i 
              LEFT JOIN ci_offline_invoice oi 
                        ON oi.customer_id = 9 
   WHERE i.customer_id = 9 
ORDER BY i.invoice_date 
   LIMIT 10
  

第一个将返回ci_invoices及其行(如果有)   customer_id = 9。

     

第二个将返回所有ci_invoices,但只有customer_id 9将返回   有任何与之相关的行。

在INNER JOIN上,它们是可以互换的,优化器会随意重新排列它们。

在OUTER JOIN上,它们不一定是可互换的,具体取决于它们所依赖的连接的哪一侧。

答案 1 :(得分:0)

您也可以参加约会:

   SELECT i.invoice_date inv, 
             i.invoice_id, 
             i.total_amount, 
             oi.invoice_date oi_inv, 
             oi.offline_invoice_number, 
             oi.invoice_amount 
        FROM ci_invoices i 
                  LEFT JOIN  ci_offline_invoice oi 
                            ON oi.customer_id = 9 and date(i.invoice_date) = oi.invoice_date
       WHERE i.customer_id = 9 
    ORDER BY i.invoice_date 
       LIMIT 10

这应仅返回左表中具有匹配的客户ID和发票日期的条目