3

次のSQLクエリがあります。

SELECT MIN(PLD.available_date) as 'FROM', MAX(PLD.available_date) as 'UNTIL', (
CASE
    WHEN DATEDIFF('2012-04-01', '2012-04-10') = (COUNT(PLD.available_date) - 1)
    THEN 'Yes'
    ELSE 'No'
END) as isAvailable, PL.*
FROM `parking_lot_dates` as PLD
INNER JOIN parking_lots as PL ON PLD.plid = PL.plid
WHERE PLD.available_date BETWEEN '2012-04-01' AND '2012-04-10'
GROUP BY PLD.plid

しかし、そのINNER JOINをCASEに入れることは可能ですか? 私が達成しようとしているのは、 isAvailable 列の値が Yes の場合に追加情報を取得し、それ以外の場合は取得しないことです。

CASE ステートメントの間に INNER JOIN を挿入しようとしましたが、うまくいきませんでした。

前もって感謝します。

4

2 に答える 2

2

希望する方法で条件付き結合を行うことはできませんが、代わりに次のことができます。

SELECT PLD.FROM, PLD.UNTIL, IF(PLD.isAvailable, 'Yes', 'No') AS isAvailable, PL.*
FROM (
    SELECT   plid
      ,      MIN(available_date) AS `FROM`
      ,      MAX(available_date) AS `UNTIL`
      ,      DATEDIFF('2012-04-01', '2012-04-10') = COUNT(*) - 1 AS `isAvailable`
    FROM     parking_lot_dates
    WHERE    available_date BETWEEN '2012-04-01' AND '2012-04-10'
    GROUP BY plid
  ) AS PLD LEFT JOIN parking_lots AS PL ON (
    PLD.isAvailable AND PL.plid = PLD.plid
  )
WHERE NOT (PLD.isAvailable AND PL.plid IS NULL)

サブクエリはテーブルに対してグループ化操作を実行し、結合条件が満たされない場合でもレコードを保持するために、サブクエリparking_lot_datesとテーブルの間で外部結合を作成します。SQL 結合について学習します。parking_lots

このWHERE句は、予期されたときにINNER JOIN一致するレコードがなかった結果を除外することで、 your の効果を模倣します。parking_lots実際にその動作が必要ない場合は省略できます。

于 2012-05-12T07:34:07.450 に答える
0

あなたが正確に何を望んでいるのかはあまり明確ではありません。おそらく、HAVING必要なのは句だけです。

SELECT PL.*
FROM parking_lot_dates AS PLD
  INNER JOIN parking_lots AS PL 
    ON PLD.plid = PL.plid
WHERE PLD.available_date BETWEEN '2012-04-01' AND '2012-04-10'
GROUP BY PLD.plid
HAVING DATEDIFF('2012-04-01', '2012-04-10') = COUNT(PLD.available_date) - 1
于 2012-05-12T07:59:40.813 に答える