从不同的表(MySQL)按字段排序查询结果

时间:2015-02-21 13:35:55

标签: mysql sorting

我有一个MySQL表结构,需要让一个特定的查询工作,但我不能以某种方式包围它。首先,这是相关的表格结构。

文件夹:

+--------------+--------------+
| Field        | Type         |
+--------------+--------------+
| id           | int(11)      |
| project_id   | int(11)      |
| finished     | int(11)      |
| approved     | int(11)      |
| comment      | varchar(500) |
+--------------+--------------+

werte:

+---------------------+---------------+
| Field               | Type          |
+---------------------+---------------+
| id                  | int(11)       |
| folder_id           | int(11)       |
| form_id             | int(11)       |
| werte               | varchar(5000) |
| number              | int(11)       |
+---------------------+---------------+

现在,我想要按照特定顺序从文件夹中检索 id 字段。我需要的前几个排序很容易实现,因为顺序由表中的字段决定。例如

SELECT id FROM folders ORDER BY approved ASC;

但是我需要另一个排序,其中 id werte 表中 werte 列中的值排序。为了使它不那么抽象, werte 表保存参数值,例如本例中的日期。 文件夹可以包含多个表单,而表单又包含多个 werte 。所以我的目标是:从文件夹中获取所有ID,从werte表中的werte列开始排序。期望 werte 列包含日期字符串,因此使用 STR_TO_DATE(werte,'%d。%m。%Y')是需要的。

检索包含日期的所有 werte 字段的有效查询将是

SELECT STR_TO_DATE(werte, '%d.%m.%Y') FROM werte where number = 2;

我无法弄清楚如何将它与我所讨论的第一个查询(从文件夹中选择所有 id )放在一起。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用join

select f.*
from folders f join
     werte w
     on w.folder_id = f.id
where w.number = 2 
order by f.approved, str_to_date(werte, '%d.%m.%Y');

作为注释:如果您要将日期存储在字符串中,则使用ISO标准格式YYYY-MM-DD。如果您使用此格式,str_to_date()将是不必要的,因为字符串表示的字母顺序是正确的。

此外,如果werte表格中可能不匹配,则应使用left join代替inner join。以上假设存在匹配(或者您只想要具有日期的行)。

答案 1 :(得分:1)

如果您想避免重复,可以在日期使用group by:

SELECT f.id, STR_TO_DATE(w.werte, '%d.%m.%Y') as d 
 FROM folders f JOIN werte w
 ON w.folder_id = f.id
 GROUP BY d
 ORDER BY d;