我有一个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 )放在一起。
答案 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;