我正在一个项目上,我需要从数据库中获取一些数据。 首先,我有一些活动,它们取决于计划的一天。我想奖励例如在第一周完成活动的用户。
为了获得第一周的活动,我正在执行以下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”作为结果。
答案 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)
使用IN
或EXISTS
:
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
和HAVING
:
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之间;