【问题标题】:MySQL: find relative values in a queryMySQL:在查询中查找相对值
【发布时间】:2013-06-20 07:12:57
【问题描述】:

上下文:事件调度软件。

感谢this question 上关于查找重复值的回答,我提出了以下查询,它非常适合查找同时安排参加两个活动的用户:

SELECT  *
FROM    panel_participants pp
WHERE   EXISTS
    (
    SELECT  1
    FROM    panel_participants pps
    WHERE   pp.user_id = pps.user_id
    AND     pp.day_time_slot_id = pps.day_time_slot_id
    AND     pp.day_time_slot_id > 0
    LIMIT 1, 1
    )

现在我需要的是一个非常相似的查询,但有一个区别:我想找到 pp.day_time_slot_id = pps.day_time_slot_id + 2 所在的项目(这将向我显示用户在哪里安排了两个连续的事件)。但是,这会返回零行:

SELECT  *
FROM    panel_participants pp
WHERE   EXISTS
    (
    SELECT  1
    FROM    panel_participants pps
    WHERE   pp.user_id = pps.user_id
    AND     pp.day_time_slot_id = pps.day_time_slot_id + 2
    AND     pp.day_time_slot_id > 0
    LIMIT 1, 1
    )

而且我知道有些行应该符合条件,例如用户 503 被安排在时隙 23 和 25 中的项目。

我尝试根据对this question 的回复设置变量,但我认为我不了解变量是如何工作以及传入和传出查询的,因为我尝试的所有操作都返回错误或零行。我已经确认day_time_slot_id 是一个整数,以防万一。

帮助?

【问题讨论】:

  • 向我们展示一些示例数据
  • 请提供一些样本数据和预期结果
  • 您的第一个查询似乎没有按照您的意愿执行。它正在记录并检查相同的记录是否出现在同一个表中。因为没有什么可以排除始终匹配自身的原始记录。假设您有面板 ID 之类的东西,很容易修复。
  • 糟糕,对不起!我在与感冒作斗争时正在编辑它,并输入了旧版本的查询——应该是 SELECT *,而不是 SELECT pp.user_id。固定。

标签: mysql variables select


【解决方案1】:

假设您在 panel_participants 表上有一个 panel_id,以下应该会为您提供在同一时间段内有 2 个小组参与的人员列表:-

SELECT  DISTINCT pp.user_id
FROM    panel_participants pp
INNER JOIN panel_participants pps
ON pp.user_id = pps.user_id
AND pp.day_time_slot_id = pps.day_time_slot_id
AND pp.panel_id != pps.panel_id
AND pp.day_time_slot_id > 0

以下应该找到那些预约了 2 个连续空档的人(尽管不确定为什么连续空档应该分开 2 个)。

SELECT  DISTINCT pp.user_id
FROM    panel_participants pp
INNER JOIN panel_participants pps
ON pp.user_id = pps.user_id
AND pp.day_time_slot_id + 2 = pps.day_time_slot_id
AND pp.day_time_slot_id > 0

恐怕我无法测试(或确定)您没有发布任何表格布局或数据。

【讨论】:

  • 非常感谢!这似乎给了我一个安排背靠背项目的人的名单。 (下午 1 点与下午 2 点相差 2 个时段,因为中间有一个 1:30 时段,出于这些目的我忽略了。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多