如何为2个表排序LEFT JOIN

时间:2015-09-27 12:33:11

标签: mysql sorting

我(反思可笑地)将我们的“下注者”存储在2个表格中,具体取决于他们是通过快速结账表格注册还是付款。

我的SQL看起来像这样:

SELECT 
    DISTINCT(sale_id), sale_punter_type, sale_comment, sale_refund, sale_timestamp, 
    punter_surname, punter_firstname, 
    punter_checkout_surname, punter_checkout_firstname,
    punter_compo_surname, punter_compo_firstname, 
    sale_random, sale_scanned, sale_id 
FROM 
    sale 
LEFT JOIN 
    punter ON punter_id = sale_punter_no 
LEFT JOIN 
    punter_checkout ON punter_checkout_id = sale_punter_no 
LEFT JOIN 
    punter_compo ON punter_compo_id = sale_punter_no 
WHERE 
    sale_event_no = :id
ORDER BY 
    punter_surname, punter_firstname, 
    punter_checkout_surname, punter_checkout_firstname

它返回结果但是首先按字母顺序列出注册用户,然后按字母顺序查看结帐用户。

我的问题是有一种方法可以将所有用户(已注册或结帐)一起按字母顺序排列在1个排序列表中,而不是2个已加入的排序列表。

我想也许我可以使用像punter_checkout_surname AS punter_surname这样的东西但是没有用。

有什么想法?我现在知道我不应该使用2个单独的表但是我现在坚持使用它。

谢谢。

2 个答案:

答案 0 :(得分:2)

我想你只想使用coalesce()

ORDER BY COALESCE(punter_surname, punter_checkout_surname)
         COALESCE(punter_firstname, punter_checkout_firstname)

其他评论:

  • 我怀疑DISTINCT是否必要。为什么这会为单个sale_id生成多行?
  • 当查询包含多个表时,请限定所有列名称(即包含表别名,以便您和其他人知道表的来源)。
  • 您的数据有三组名称。这似乎有点矫枉过正。
  • 您可能希望将COALESCE()放在SELECT中,这样您就不会在查询中生成太多名称。

答案 1 :(得分:0)

这是我的答案:

ORDER BY 
    COALESCE( UCASE( punter_surname) , UCASE( punter_checkout_surname ), UCASE( punter_compo_surname ) ) , 
    COALESCE( UCASE( punter_firstname ) , UCASE( punter_checkout_firstname ), UCASE( punter_compo_firstname) )