sql >> データベース >  >> RDS >> Mysql

行内の重複する値を比較するにはどうすればよいですか?

    Shahkalpeshは次のように質問に答えました:

    私はこれが間違っていると思うコメントを投稿し、2つの反例を示しました:

    私のコメントへの返答として、Shahkalpeshは次のように要求しました:

    十分に公平です-はい。少し編集しましたが、質問には次のように書かれています:

    • 午前7時から午後1時まで、または
    • 午前9時から午後1時まで、または
    • 午前9時から午後5時まで。

    十分な背景。予定の日付は無視して、時間を考慮するだけです。記録される時間をhh:mm形式に制限する簡単な方法があると思います。すべてのDBMSが実際にそれを提供しているわけではありませんが、hh:mm:ssを処理するための拡張は簡単です。

    Appointments
    
    Row     timeStart   timeEnd   Note
      1     07:00       13:00     First valid range
      2     09:00       13:00     Second valid range
      3     09:00       17:00     Third valid range
      4     14:00       17:00     First plausibly valid range
      5     05:00       06:00     First probably invalid range
      6     18:00       22:30     Second probably invalid range
    

    09:00〜13:00の範囲に重複する予定を検索すると、Shahkalpeshの(簡略化された)クエリは次のようになります。

    SELECT * FROM Appointments
        WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
    

    これにより、6行すべてのデータが返されます。ただし、行1、2、3のみが09:00〜13:00の期間と重複しています。行1、2、および3が唯一の有効な代表的な予定値である場合、Shahkalpeshのクエリは正しい答えを生成します。ただし、行4(おそらく有効だと思います)が許可されている場合は、返されるべきではありません。同様に、行5と6(存在する場合)は返されません。 [実際には、仮定 timeStart <= timeEnd テーブル内のすべての行(および混乱させるNULL値がない)について、Shahkalpeshのクエリは09:00-13:00クエリのデータの任意の行を返すことがわかります。行が09:00より大きいか、終了時刻が13:00未満であるか、またはその両方です。これは書くことと同じです 1 = 1 またはWHERE句のその他のトートロジー。 ]

    ShaneDのクエリを(簡略化して)検討すると:

    SELECT * FROM Appointments
        WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
    

    行1、2、および3も選択していることがわかりますが、行4(timeStart> '13:00'のため)、5(timeEnd <'09:00'のため)、および6(timeStart> '13のため)を拒否します。 00')。この式は、「重複」し、「会う」および「会う」を数える行を選択する方法の典型的な例です(「アレンの区間代数 "、たとえば)オーバーラップとして。'>='と'<='を変更すると、オーバーラップとしてカウントされる間隔のセットが変更されます。



    1. CakePHPのGROUPとCOUNT()の年齢

    2. MySQLDBの列名のハイフン

    3. 私のSQLダイナミッククエリが実行され、ストアドプロシージャの変数に出力されます

    4. Neo4j-Cypherを使用して制約を削除する