0
SELECT unit.id,
       unit.unit_name,
       unit.description,
       unit.category_id,
       city.name,
       mealbase.name AS mealbase_name,
       unit.province_id,
       unit.rooms,
       unit.max_people,
       unit.thumblocation,
       prices.normal_price,
       prices.holiday_price
FROM   jos_units AS unit,
       jos_prices AS prices,
       jos_cities AS city,
       jos_meal_basis AS mealbase
WHERE  prices.unit_id = unit.id
       AND city.id = unit.city_id
       AND unit.published = 1
       AND unit.mealbasis_id = mealbase.id

このクエリを実行すると、以下のような冗長な結果セットが得られます。

ここに画像の説明を入力してください

しかし、私が追加した場合

SELECT DISTINCT unit.idSELECT unit.id最初または GROUP BY unit.unit.id最後の代わりに。以下のような正しい結果セットが得られます。

ここに画像の説明を入力してください

私の問題は私のクエリの何が問題になっていますか(上記の結合は、修正して結合した場合でも冗長な結果をもたらします)?ここでクエリ(問題を修正する)にSELECT DISTINCT unit.idまたはを追加するのはなぜですか?GROUP BY unit.unit.id(DISTINCTとGROUP BYは異なる機能です)

`SELECT DISTINCT unit.idを追加すると冗長な結果が削除されることはわかっていますが、2つのスニペットのいずれかを追加すると同じ結果セットがどのように得られますか?明らかに、SELECT DISTINCT unit.idは、GROUP BYがどのように行うかによって、冗長な行を削除する必要がありますか?

4

4 に答える 4

3

上記の結合により、結合を修正しても冗長な結果が得られるのはなぜですか?

それは、あなたのテーブルが次のようになっているためです。

  • jos_units.
  • jos_prices.
  • jos_cities.
  • jos_meal_basis.

互いに関連しています。

これらのテーブル間に 1 対多または多対多の関係があるようです。たとえば、 の各レコードではjos_meal_basis、各食事に単位があるため、多くの食事が同じ単位で測定される可能性があります。このため、2 つのテーブルを結合すると、冗長な単位が得られます。他のテーブルも同様。

于 2012-12-17T09:50:44.513 に答える
3

基本的に、集計関数を使用せずに結果をグループ化します (たとえばCOUNT、 、またはを使用)。したがって、オブジェクトMAXを選択して取得するのと同じ方法で集計行を取得します。DISTINCTそれらを集約する必要がない場合DISTINCTは、正しいことです。

于 2012-12-17T09:37:11.990 に答える
1

最初のクエリでの組み合わせ、つまり

(unit.id,
       unit.unit_name,
       unit.description,
       unit.category_id,
       city.name,
       mealbase.name AS mealbase_name,
       unit.province_id,
       unit.rooms,
       unit.max_people,
       unit.thumblocation,
       prices.normal_price,
       prices.holiday_price) has duplicates and so you are getting more than 1 rows for the same combination. 

使用するdistinct clause or group byと、上記の組み合わせで重複が削除されます。これがお役に立てば幸いです。

于 2012-12-17T09:42:44.947 に答える
1

GROUP BY集計関数またはグループ関数を使用する場合に主に使用されます。たとえば、一致する行の数を見つけたい場合は、次のことができます

SELECT
  id
, COUNT(id) num_rows
FROM
...
GROUP BY id

これCOUNTは集計関数であるため、他の列でグループ化する必要があります。集計関数を実行していない場合は、GROUP BY基本的に行を集計するだけで (そのように記述した場合)、行が 1 つだけになります - と同じDISTINCTです。

于 2012-12-17T09:43:38.240 に答える