如何选择今日活动的行?

时间:2011-08-20 19:02:25

标签: mysql sql select

我有一组表格(电话簿,号码,附加字段,附加内容)

  • 电话簿 - 用户电话簿列表(usernamebook_idtitle
  • 数字 - 每个电话簿号码列表(number_idbook_idnumberfullname
  • extrafields - 额外字段列表(生日,电子邮件,...)及其表格字段为:field_idtitle
  • extradatas - 每个号码额外档案的额外数据列表(book_idfield_idnumber_idvalue
  • relations - 哪个额外字段属于哪个电话簿(book_idfield_id

想象一下拥有电话簿和额外生日字段的用户 我如何选择今天生日的数字?

编辑:我已经在我手中指定了unamebook_idfield_id(来自PHP脚本),结果必须限于这些值。< / p>

请注意,我将日期字段保存在unix时间戳和extradatas中。value类型为varchar。
这是我生命中最难数学加入选择(我认为)。

为何选择数学? :因为我想从unix时间戳计算天数,而不需要使用函数(如DATE_FORMAT)

2 个答案:

答案 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的索引。