我有一组表格(电话簿,号码,附加字段,附加内容)
username
,book_id
,title
)number_id
,book_id
,number
,fullname
)field_id
,title
book_id
,field_id
,number_id
,value
)book_id
,field_id
)想象一下拥有电话簿和额外生日字段的用户 我如何选择今天生日的数字?
编辑:我已经在我手中指定了uname
,book_id
,field_id
(来自PHP脚本),结果必须限于这些值。< / p>
请注意,我将日期字段保存在unix时间戳和extradatas
中。value
类型为varchar。
这是我生命中最难数学加入选择(我认为)。
为何选择数学? :因为我想从unix时间戳计算天数,而不需要使用函数(如DATE_FORMAT)
答案 0 :(得分:0)
尝试torun:
Select number from numbers as n inner join extradatas e on (n.number_id=e.number_id and n.book_id=e.book_id) inner join extrafields ex on e.field_id=ex.field_id
where ex.title='birthday' and DATE_FORMAT(ex.value, '%Y-%m-%d')=DATE_FORMAT(NOW(), '%Y-%m-%d')
答案 1 :(得分:0)
SELECT DISTINCT n.number
FROM phonebooks p
INNER JOIN numbers n ON n.book_id = p.book_id
INNER JOIN extradatas ed ON ed.book_id = n.book_id
INNER JOIN extrafields ef ON ef.field_id = ed.field_id AND ef.title = 'birthday'
WHERE p.book_id = :book_id
AND p.username = :username
AND ed.value BETWEEN unix_timestamp(DATE(now()))
AND unix_timestamp(DATE(now()) + INTERVAL 1 DAY);
请注意,我的答案和@Andrej L's之间唯一的显着差异(我看到)是我如何比较日期。在较大的数据集上,@ Andrej L's解决方案需要使用DATEFORMAT转换系统中的每个生日。我的解决方案应该允许MySQL一次性地评估比较,并且可能利用extrafields.value的索引。