ALL运算符的MySQL问题

时间:2018-10-01 11:42:18

标签: mysql sql

我正在一个项目上,我需要从数据库中获取一些数据。 首先,我有一些活动,它们取决于计划的一天。我想奖励例如在第一周完成活动的用户。

为了获得第一周的活动,我正在执行以下SQL:

SELECT activitat
FROM planning_activitats
WHERE (activitat <> 'CTS' AND activitat <> 'TRU' AND activitat <> 'Test')
  AND dia >= 1 AND dia <= 7

此查询正确,我以正确的方式获得了所有活动。好的,现在我想知道哪些用户已经执行了这些活动,并且执行了以下SQL:

SELECT user
FROM activitats_completades
WHERE activitat = ALL ($sql)
  AND user NOT IN (SELECT user FROM puntuacions_setmanals WHERE setmana = 1)

$sql是第一个SQL。 WHERE (AND user NOT IN...)的第二部分是因为我需要管理已授予哪些用户,而下次不能授予他们。

我认为问题出在ALL运算符中,因为我正在执行查询并且得到0个结果。我在做什么不好?我检查了数据库和数据是否正确,它应该给我一些用户,因为我有完成所有活动的用户。

感谢您的帮助。

编辑:数据样本->用户“用户”已完成活动“ ACT1,ACT2,ACT3”,“用户2”已完成“ ACT1,ACT4”,本周活动为“ ACT1,ACT4”。在这种情况下,应该以“ user2”作为结果。

4 个答案:

答案 0 :(得分:1)

这里应该可以解决您的问题。这是我之前所说的,但是很漂亮且有用:

SELECT user
FROM activitats_completades
WHERE activitat IN (
    SELECT activitat
    FROM planning_activitats
    WHERE (activitat <> 'CTS' AND activitat <> 'TRU' AND activitat <> 'Test')
    AND dia >= 1 AND dia <= 7
)
AND user NOT IN (SELECT user FROM puntuacions_setmanals WHERE setmana = 1)
GROUP BY user
HAVING COUNT(activitat) = (
    SELECT COUNT(activitat)
    FROM planning_activitats
    WHERE (activitat <> 'CTS' AND activitat <> 'TRU' AND activitat <> 'Test')
    AND dia >= 1 AND dia <= 7
)

答案 1 :(得分:0)

使用INEXISTS

SELECT ac.user
FROM activitats_completades ac
WHERE ac.activitat IN (SELECT pa.activitat
                       FROM planning_activitats pa
                       WHERE pa.activitat NOT IN ('CTS', 'TRU', 'Test') AND
                             pa.dia >= 1 AND pa.dia <= 7
                      ) AND
     ac.user NOT IN (SELECT ps.user FROM puntuacions_setmanals WHERE ps.setmana = 1);

无需将返回的值保存在变量中。

要获取匹配所有活动的用户,请使用GROUP BYHAVING

SELECT ac.user
FROM activitats_completades ac
WHERE ac.activitat IN (SELECT pa.activitat
                       FROM planning_activitats pa
                       WHERE pa.activitat NOT IN ('CTS', 'TRU', 'Test') AND
                             pa.dia >= 1 AND pa.dia <= 7
                      ) AND
     ac.user NOT IN (SELECT ps.user FROM puntuacions_setmanals WHERE ps.setmana = 1)
GROUP BY ac.user
HAVING COUNT(*) = (SELECT COUNT(*)
                   FROM planning_activitats pa
                   WHERE pa.activitat NOT IN ('CTS', 'TRU', 'Test')
                  );

这假定每个表都没有重复项。您可能需要COUNT(DISTINCT)

答案 2 :(得分:0)

您可以使用IN运算符,因为您想将每个“活动”与SQL查询的每个结果进行比较。只要确保不要在($ sql)查询中返回多列即可。

SELECT user 
FROM activitats_completades 
WHERE activitat IN
    ($sql)
AND user NOT IN 
    (SELECT user 
     FROM puntuacions_setmanals 
     WHERE setmana=1)

答案 3 :(得分:0)

请为激活列使用IN运算符,为dia列使用in运算符:

SELECT活动 来自planning_activitats 不在其中的活动(“ CTS”,“ TRU”,“测试”)和直径介于1到7之间;