2

マイ Pastebin : http://pastebin.com/PmfDEdEw

やあ、

バス検索スクリプトを実行しています。ここに「bus_notavailable」というテーブルがあり、次のフィールドがあります。

nodate_id(PK)
bus_id(FK)
DD(INT 2)
MM(INT 2)
and YYYY(INT 4)

私の質問は次のとおりです。バス ID が 1 で、2013 年 8 月 15 日と 2013 年 1 月 26 日の 2 つの日付で利用できないと仮定すると、この日のレコードはフィルター処理されます...

ノード表

Nodate_id             bus_id        DD     MM     YYYY
1                     1             15     08     2013
2                     1             26     01     2013 

• so bus_notavailable.DD != '26' 1 つのレコードが表示されます

• bus_notavailable.DD != '11' すると、2 つのレコードが表示されます

私は間違いを犯したか、解決策がわからないので、取り除く方法を知りたいと思っています。これは、「bus_notavailable」が同じバスの 2 つの ID を持っている 1 対多の関係の問題であることを知っていました。 「バス」テーブルからの 2 つのレコード。

これを達成するためにサブクエリが必要ですか、それとも他の方法がありますか?

4

2 に答える 2

0

あなたの条件はこちら

    LEFT JOIN bus_notavailable ON bus.bus_id = bus_notavailable.bus_id
           .....
    WHERE   ...... 
            bus_notavailable.bus_id IS NULL
            AND bus_notavailable.DD != '$DD'
            AND bus_notavailable.MM != '$MM'
            AND bus_notavailable.YYYY != '$YYYY'

bus_id が NULL になると、または列bus_notavailableを比較するレコードがないため、無意味です。DDMMYYYY

必要な条件は次のとおりです (DD/MM/YYYY を LEFT JOIN 句に移動しONます)。

    LEFT JOIN bus_notavailable ON bus.bus_id = bus_notavailable.bus_id
            AND bus_notavailable.DD = '$DD'
            AND bus_notavailable.MM = '$MM'
            AND bus_notavailable.YYYY = '$YYYY'
           .....
    WHERE   ...... 
            bus_notavailable.bus_id IS NULL
于 2012-10-22T23:10:00.210 に答える
0

男)))))) まず第一に、あなたは何を達成したいのか言いませんでした。DD日に利用可能なバスを選択したい場合は、正しいことをしています。

あなたが言うように、DDが11に等しくないレコードを選択するため、2行目が2行を返す理由。そして、この表では、両方のレコードが適しています。そのため、2行になります。

このテーブルに多数の日付がある場合に、特定の日付に利用可能なバスを 1 つだけ選択したい場合は、distinct キーワードを使用する必要があります。

dd!=11 の個別のバスを選択します。あなたは1行を取得します))

バスごとに1行だけという意味です。したがって、その日に利用可能なバスが 10 台ある場合は、10 件のレコードがあります。バスごとに 1 つのレコード。

于 2012-10-22T23:14:53.890 に答える