MySQL - 如何根据另一个表中的列进行排序

时间:2014-08-25 03:02:41

标签: php mysql

我有这些表格:

表'数据':

| Customer | Category | Brand | Market | A | B |
|==========|==========|=======|========|===|===|
| Bill     | 5        | 4     |1       |2  |9  |
| Bill     | 5        | 4     |1       |6  |15 |
| Bill     | 5        | 4     |1       |1  |30 |
| Greg     | 7        | 9     |3       |5  |1  |
| Amy      | 9        | 2     |1       |1  |8  |

表'客户':

| Cust | Mkt | SubMkt |
|======|=====|========|
| Bill | 1   | NY     |
| Bill | 2   | Arizona|
| Bill | 3   | Cali   |
| Greg | 1   | Ohio   |
| Amy  | 1   | Texas  |

表'排序':

| SubMarket | SortBy |
|===========|========|
| Cali      | A      |
| Ohio      | B      |
| Arizona   | A      |
| NY        | A      |

我需要从几个不同列中排序的“数据”中选择全部,然后根据其他2个表所说的选择A或B。

SELECT *
FROM Data
ORDER BY Customer, Category, Brand, Market, (A or B)

基本上,表Customer中的Market Data会链接到Cust Mkt在表格Customer中,然后在表格SubMkt中的Customer链接到表格SubMarket中的Sort。然后表SortBy中的Sort将是我需要在表Data中排序的列。希望这是有道理的。

因此,在上面的示例中,Data中包含Customer的“Bill”和Market的“1”的所有行都将按列{{1}排序}。

我开始在PHP中编写一个对象数组,然后我会根据一个对象属性对数组进行排序,但这实际上需要对我现有的代码进行大规模的改造。我认为我正在寻找的东西可以在MySQL中使用相当直接的查询来完成,但我不太了解MySQL以便编写该查询。任何帮助将不胜感激!

编辑:我应该提到,这些只是部分表格。我正在使用的实际表格是数千行,每个“SubMarket”都有匹配的“SortBy”。

修改2:澄清表A中需要Customer Market才能链接到Data 和Cust中的Mkt

2 个答案:

答案 0 :(得分:1)

您需要CASE expression

CASE `Sort`.`SortBy`
  WHEN "A" THEN `Data`.`A`
  WHEN "B" THEN `Data`.`B`
  ELSE NULL
END CASE

ELSE NULL部分是可选的,但它可以帮助揭示数据问题。

答案 1 :(得分:1)

这只是一个显示如何进行连接的答案.. Ignacio应该有接受的答案,因为他首先提供了难点:)

SELECT d.*
FROM data d
JOIN customers c on c.cust = d.customer AND c.mkt = d.market
JOIN sort s on s.submarket = c.submkt
ORDER BY 
    d.Customer, 
    d.Category, 
    d.Brand,  
    d.Market, 
    CASE s.sortby
        WHEN 'A' THEN d.A
        WHEN 'B' THEN d.B
        ELSE 9999999
    END