-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 |
| | ... | ... | ... |
+------------+------------+----------+

私は3つのものが必要です:

期待される結果

制約 : すべてのトレーニング要求 (ID_TR) が OK ではないことを意味します (>> すべての割り当てられた計画要求 (ID_PR) が TRAINER EQUALS (NULL または FREE) を持つすべてのトレーニング要求 (ID_TR)

+------------+-------+
| | ID_TR | フィールド |
+------------+-------+
| | 254 | .. |
| | 286 | .. |
+------------+-------+

Constraint : ほぼ OK のすべての training_requests (ID_TR)、つまり、(>> すべての割り当てられた計画要求 (ID_PR) を持つすべての TRAINING REQUESTS(ID_TR) が、(NULL または無料) とは少なくとも 1 度異なる (NULL または無料) であり、すべてではありません割り当てられたトレーナー (NULL または無料とは異なります)

+------------+-------+
| | ID_TR | フィールド | フィールド |
+------------+-------+
| | 405 | .. |
+------------+-------+

Constraint : 正常ではない、またはほぼ正常であるすべての training_requests

+------------+------+
| | ID_TR |フィールド |
+------------+------+
| | 405 | .. |
| | 254 | .. |
| | 286 | .. |
+------------+------+

すべてのthx!

4

2 に答える 2

0

次の(おそらく非効率的な)方法で実行できます。

#1OKではない

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ほぼOK

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 に答える