-2

我是 SQL 新手,遇到问题希望您能帮助我:

mysql5

表 TRAINING_REQUESTS

+------------+--------+
| ID_TR | 领域 |
+------------+--------+
| ... | .. |
| 254 | .. |
| ... | .. |
| 286 | .. |
| ... | .. |
| 401 | .. |
| ... | .. |
| 405 | .. |
| 406 | .. |
| ... | .. |
+------------+--------+

表 PLANNING_REQUESTS

+----------+----------+----------+
| ID_PR | ID_TR | 培训师 |
+----------+----------+----------+
| ... | ... | ... |
| 第475章 254 | 空 |
| 第476章 254 | 空 |
| 第477章 254 | 空 |
| 478 | 286 | 空 |
| 第479章 286 | 免费 |
| 480 | 286 | 免费 |
| 481 | 401 | 免费 |
| 第482章 401 | 1 |
| 第483章 401 | 免费 |
| 484 | 405 | 空 |
| 485 | 405 | 1 |
| 第486章 405 | 5 |
| 第487章 405 | 免费 |
| 488 | 406 | 1 |
| 489 | 406 | 5 |
| 490 | 406 | 5 |
| 491 | 406 | 2 |
| ... | ... | ... |
+----------+----------+----------+

我需要三样东西:

预期结果

约束:所有训练请求(ID_TR)都不好,这意味着(>> ALL TRAINING REQUESTS(ID_TR)具有所有分配的计划请求(ID_PR)与培训师相等(空或免费)

+------------+--------+
| ID_TR | 领域 |
+------------+--------+
| 254 | .. |
| 286 | .. |
+------------+--------+

约束:几乎没问题的所有培训请求(ID_TR),这意味着(>>所有培训请求(ID_TR)具有所有分配的计划请求(ID_PR)与培训师至少一次不同(空或免费)而不是全部指定的培训师(不同于 NULL 或 FREE)

+------------+--------+
| ID_TR | 领域 |
+------------+--------+
| 405 | .. |
+------------+--------+

约束:所有不正常且几乎正常的 training_requests

+------------+------+
| ID_TR |字段 |
+------------+------+
| 405 | .. |
| 254 | .. |
| 286 | .. |
+------------+------+

谢谢大家!

4

2 回答 2

0

可以通过以下方式(可能效率低下)来完成:

#1不好

SELECT tr.*
FROM TRAINING_REQUESTS tr
JOIN PLANNING_REQUESTS pr ON tr.id_tr = pr.id_tr
GROUP BY pr.id_tr
HAVING SUM(CASE WHEN pr.trainer IS NULL or pr.trainer = 'FREE' THEN 1 ELSE 0 END) = COUNT(*)
;

#2几乎可以

SELECT tr.*
FROM TRAINING_REQUESTS tr
WHERE EXISTS (SELECT 1 
              FROM PLANNING_REQUESTS pr 
              WHERE tr.id_tr = pr.id_tr 
              AND pr.trainer IS NOT NULL AND pr.trainer <> 'FREE') 
  AND EXISTS (SELECT 1 
              FROM PLANNING_REQUESTS pr 
              WHERE tr.id_tr = pr.id_tr 
              AND (pr.trainer IS NULL OR pr.trainer = 'FREE'))        
;

#3

    SELECT tr.*
    FROM TRAINING_REQUESTS tr
    WHERE EXISTS (SELECT 1 
                  FROM PLANNING_REQUESTS pr 
                  WHERE tr.id_tr = pr.id_tr 
                  AND (pr.trainer IS NULL OR pr.trainer = 'FREE'))        
;

这是带有结果的SQL Fiddle 。

请注意,我在#2(以及因此,#3)中的结果与您的不同,因为它们包括401

于 2014-01-26T22:17:20.047 回答
0
    SELECT tr.ID_TR,tr.field 
    FROM planning_requests pr 
    INNER JOIN training_requests tr 
    ON tr.ID_TR = pr.ID_TR 
    WHERE pr.ID_TR NOT IN 
      (
      SELECT cpr.ID_TR 
      FROM planning_requests cpr 
      WHERE trainer IS NOT NULL AND trainer <> 'FREE' 
      ) 
    GROUP BY ID_TR
于 2014-01-27T00:02:25.873 回答