7

次のようなニューステーブルがあります

ニュース:

| id  | title                       | description
| 1   | Breaking news               | bla bla bla
| 2   | Heavy snowfall in london    | bla bla bla

次のようなタイプ テーブル:

| id  | type_name   | type_code
| 1   | weather     | 0567
| 2   | city        | 0653

および次のような NewsType テーブル

|id | news_id | type_id | created_by |
| 1 | 2       | 1       | "John"     |
| 2 | 2       | 2       | "Alex"     |

NewsType テーブルからわかるように、1 つのニュースが 2 つ以上のタイプに分類される可能性があります。

タイプに対応するニュースを表示する必要があります。ユーザーは、都市と天気に関するすべてのニュースを教えてくれると言うかもしれません。これを表示するには、次のようにしています。

      select distinct n.* , nt.created_at
      from news n, newstype nt, type t where
      n.id = nt.news_id and
      t.id = nt.type_id 
      order by nt.created_at
      limit 25

問題は、このクエリが同じニュースを 2 回返すことです (内部結合が原因だと思います)。ニュースが 2 つのタイプに分類され、ユーザーが同じ 2 つのタイプのニュースを表示するように要求した場合、1 つのニュース項目のみを取得するには、クエリで何を変更すればよいですか? 2つではなく!

4

5 に答える 5

1

試す

select distinct n.id, n.title, n.description

しかし、@Jan Dvorakが述べたように、

select distinct n.*

同じニュースを 2 回選択しないでください

于 2012-10-23T11:04:56.220 に答える
0

特定のタイプの NewsType テーブルにエントリがあるすべての記事を選択するとします。したがって、タイプとの関係が存在するニュース項目を選択する必要があります。

SELECT
    News.ID,
    News.Title,
    News.Description
FROM
    News
WHERE
    EXISTS
    (SELECT
        NULL
    FROM
        NewsType
        INNER JOIN Type ON NewsType.Type_ID = Type.ID
    WHERE
        News.ID = NewsType.News_ID
    AND Type.Type_Code = @typeCode)

型名をパラメーターとして使用している場合は、where 句の最後の行を Type.Type_Name = @typeName に変更する必要がある場合があります。

于 2012-10-23T11:04:24.117 に答える