【问题标题】:MYSQL two ORDER BY or nested orderMYSQL 两个 ORDER BY 或嵌套顺序
【发布时间】:2013-07-16 17:34:39
【问题描述】:

我在我的网络应用程序上遇到了一个(我想是)ORDER BY 问题。没有其他问题/答案似乎与我的相同,或者我不能适用于我的问题。我会尽量用一个可以解决我的问题的简单案例来解释自己。

想象 3 个表格,“Customers”、“Address”和“CustomersAddress”。

**Customers**
id,  name,      surname
1,  "John",    "Willis"
2,  "Sarah",   "Davies"
3,  "Mark",    "Jones"
4,  "Linda",   "Ede"

**Address**
id_dir, address
1,      "some adress"
2,      "other address"
3,      "holliday address"
4,      "my other house address"
5,      "Flat in the beach address"

**CustomersAdress**
id_ca, id_customer, id_address
1,         1,       4
2,         2,       4
3,         3,       1
4,         1,       2
5,         2,       2
6,         4,       5
7,         4,       3

很明显,CustomersAdress 是一个将客户与他们拥有的地址相关联的表。

通过简单的 INNER JOIN,我可以得到如下所有关系:

SELECT id_customer, surname, name, id_dir, address
FROM CustomersAddress
INNER JOIN Customers ON Customers.id=CustomerAddress.id_customer
INNER JOIN Address ON Address.id_dir=CustomerAddress.id_address

有了这些,我可以用 ORDER BY 订购,例如,如下

ORDER BY surname

甚至

ORDER BY surname, id_dir / ORDER BY surname, id_dir

使用“ORDER BY id_dir, surname”的例子我会得到:

idcustomer,  surname,   name,     id_dir,    address
3,           "Jones",   "Mark",   1,         "some address"
2,           "Davies",  "Sarah",  2,         "other address"
1,           "Willis",  "John",   2,         "other address"
4,           "Ede",     "Linda"   3,         "holliday address"
2,           "Davies",  "Sarah",  4,         "my other house address"
1,           "Willis",  "John",   4,         "my other house address"
4,           "Ede",     "Linda",  5,         "Flat in the beach address"

直到这里没有什么新鲜事。但我想要做的是嵌套订单(不知道如何命名)订单将是与地址相关的姓氏和拥有该地址的客户。

所以,首先查找第一个地址的第一个姓氏(Davies),然后查找具有相同地址(独立于姓氏)的客户,并获取他们(Willis),然后继续下一个客户姓氏或地址如果有更多来自同一客户。以此类推。

我想要的结果:

idcustomer,  surname,   name,   id_dir,    address
2,           "Davies",  "Sarah",  2,       "other address"
1,           "Willis",  "John",   2,       "other address"
2,           "Davies",  "Sarah",  4,       "my other house address"
1,           "Willis",  "John",   4,       "my other house address"
4,           "Ede",     "Linda",  3,       "holliday address"
4,           "Ede",     "Linda",  5,       "Flat in the beach address"
3,           "Jones",   "Mark",   1,       "some address"

这甚至可以使用 mysql 查询吗?还是一种独特/更好的方法是进行示例查询,将其保存在数组中并使用 php 从那里订购?在这两种情况下我怎样才能得到它。

感谢任何帮助或建议!

【问题讨论】:

    标签: php mysql group-by sql-order-by


    【解决方案1】:

    你可以使用mysql的FIELD()

    SELECT id_customer, surname, name, id_dir, address
    FROM CustomersAddress
    INNER JOIN Customers ON Customers.id=CustomersAddress.id_customer
    INNER JOIN Address ON Address.id_dir=CustomersAddress.id_address
    ORDER BY FIELD(id_dir, 2,4,3,5,1), surname;
    

    SQLFiddle 示例 - http://sqlfiddle.com/#!2/3ea9c/18

    这需要子查询或预查询来获取订单。

    【讨论】:

    • 非常感谢!正如您所说,使用我想要的地址进行预查询(因为在我的应用程序中,并非地址表中的所有地址都需要),并且 FIELD() 将完成这项工作。
    【解决方案2】:

    尝试按所需顺序排序: ORDER BY table_one.field_A ASC table_two.field_E DESC

    【讨论】:

    • 这些组合都不会产生我想要的结果。期望结果不是简单 ORDER BY 查询的正常结果。
    【解决方案3】:

    您只需先按地址订购:

    ORDER BY id_dir, surname
    

    【讨论】:

    • 请注意,我想要的结果不是一个简单的 ORDER BY 查询,因为 id_dir 需要在下一个 id_dir mysql_fetch_array 结果之前对所有按姓氏排序的所有者进行分组。简单的 ORDER BY 给出的解决方案将始终根据 id_dir 值返回混合客户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多