复杂的MySQL订单不工作

时间:2009-12-07 13:03:11

标签: sql mysql

这是我正在使用的select语句。排序时会出现问题。当它如下所示时,它只按t2.userdb_user_first_name排序,如果我把它放在第一个或第二个并不重要。当我删除它时,它可以通过displayorder字段值对进行排序。所以我知道这部分是有效的,但不知何故,两者的结合导致first_name覆盖它。我想要的是首先按照displayorder对记录进行排序,然后在其中进行first_name

SELECT t1.userdb_id
FROM default_en_userdbelements as t1
  INNER JOIN default_en_userdb AS t2 ON t1.userdb_id = t2.userdb_id
WHERE t1.userdbelements_field_name = 'newproject'
  AND t1.userdbelements_field_value = 'no'
  AND t2.userdb_user_first_name!='Default'
ORDER BY
  (t1.userdbelements_field_name = 'displayorder' AND t1.userdbelements_field_value),
  t2.userdb_user_first_name;

编辑:这是我想要完成的。我想列出userdb表中的用户(不是新项目),以及有关存储在userdbelements中的用户的详细信息。我希望首先按userdbelements.displayorder排序,然后按userdb.first_name排序。我希望这是有道理的?感谢您的快速帮助!

编辑:对不起消失,这里有一些示例数据

userdbelements

userdbelements_id   userdbelements_field_name   userdbelements_field_value  userdb_id
647 heat        1
648 displayorder    1 - Sponsored   1
645 condofees       1

USERDB

userdb_id   userdb_user_name    userdb_emailaddress userdb_user_first_name  userdb_user_last_name
10  harbourlights   info@harbourlightscondosminium.ca   Harbourlights   1237 Northshore Blvd, Burlington
11  harbourview info@harbourviewcondominium.ca  Harbourview 415 Locust Street, Burlington
12  thebalmoral info@thebalmoralcondominium.ca  The Balmoral    2075 & 2085 Amherst Heights Drive, Burlington

3 个答案:

答案 0 :(得分:0)

您正在尝试使用无效的ORDER BY。

ORDER BY (t1.userdbelements_field_name = 'displayorder' AND t1.userdbelements_field_value)

它必须引用表列或返回的别名列。

我真的无法理解这个查询是如何实现的,因为你已经有限了 t1.userdbelements_field_name = newproject ,然后您希望在等于 displayorder 的情况下订购。

您能否修改一下您的问题,准确说明您要按照订单条款完成的目的是什么?

答案 1 :(得分:0)

根据我的理解,您必须仅为default_en_userdbelements值加入displayorder。但是,我怀疑您的查询有问题,并且它可能会返回userdb_id的重复值。

也许你应该说出你想要实际做的事情,而不是解释你尝试这样做的方式。

  SELECT t1.userdb_id
    FROM default_en_userdbelements AS t1
    JOIN default_en_userdb         AS t2 ON t1.userdb_id = t2.userdb_id

    JOIN default_en_userdbelements AS o  ON (o.userdb_id,  o.userdbelements_field_name)
                                          = (t1.userdb_id, 'displayorder')

   WHERE t1.userdbelements_field_name   = 'newproject'
     AND t1.userdbelements_field_value  = 'no'
     AND t2.userdb_user_first_name     != 'Default'

ORDER BY o.userdbelements_field_value,
         t2.userdb_user_first_name

答案 2 :(得分:0)

你可以这样做:

ORDER BY 
  (CASE WHEN t1.userdbelements_field_name = 'displayorder' 
  THEN t1.userdbelements_field_value 
  ELSE $some_large_number 
  END),
 t2.userdb_user_first_name;

t1.userdbelements_field_value时使用t1.userdbelements_field_name = 'displayorder'的值进行排序,但您必须提供相同类型的其他值才能申请ELSE