0

SQLでこれを解決する方法がわかりません:

テーブル広告:

ad_id
ad_title
ad_type_id

.... テーブル ADS_DATA:

ad_data_id
ad_id
ad_data_name
ad_data_value

わかりました、簡単にしてみましょう: テーブル ADS は、タイプ ad_type_id のオブジェクトの共通データを格納します。テーブル ADS_DATA は、その ad_type_id に応じて、オブジェクトの追加データを格納します。

ADS_DATA.ad_data_name にはデータの名前 (通常のテーブルでは列名) が格納され、ADS_DATA.ad_data_value にはこのデータの値が格納されます。ad_type_id に応じて、ADS_DATA テーブルには特定の ad_data_name 値が入力されます。例えば:

ADS
ad_id = 1,ad_type_id = 2
ad_id = 2,ad_type_id = 3
ADS_DATA
ad_data_id = 1,ad_id = 1,ad_data_name = 'rooms',ad_data_value = 2
ad_data_id = 2,ad_id = 1,ad_data_name = 'size',ad_data_value = 20
ad_data_id = 3,ad_id = 2,ad_data_name = 'fingers',ad_data_value = 15
ad_data_id = 4,ad_id = 2,ad_data_name = 'toes',ad_data_value = 5

OK、特定の ad_id (名前または値に関係なくすべての行) を使用して ADS_DATA からすべての行を取得する方法と、(ad_data_name = x and ad_data_value = y) AND (ad_data_name = x1 and ad_data_value = y2) AND ...

私はそれがひどい混乱であることを知っていますが、読んでくれてありがとう!!

更新: ここに例があります: さまざまなカテゴリ (ADS.ad_type_id) の広告システムを構築しようとしています。選択した広告のタイプに応じて、ads_data テーブルには、このカテゴリに固有のデータが入力されます。たとえば、AD ハウス カテゴリは、ads_data テーブルに含まれます。各カテゴリの可能なすべてのデータの名前を含む列を使用し、必要なものだけを入力しますが、それは無駄だと思ったので、列を含むテーブルを作成することにしました:

ad_data_id        UNIQUE ID
ad_id             REFERENCE TO ADS.ad_id
ad_data_name      for the "column name",e.g: house_rooms
ad_data_value     for the value.

INSTEAD OF A "NORMAL" RELATION:
ad_data_id        UNIQUE ID
ad_id             REFERENCE TO ADS.ad_id
house_rooms       ad data,only fill columns relative to choseen category(e.g:house_)
house_size
house_baths
car_engine
car_hp
car_year
...

ADS テーブルを検索し (たとえば、広告価格でフィルタリングします (これはすべての広告に共通のデータであるため、ADS_DATA ではなく ADS テーブルにあります)、次のような行のみを取得します:(house_rooms BETWEEN X AND Y) AND (house_size BETWEEN A AND B). ADS_DATA 列の間には、「OR」ではなく「AND」が必要です。各カテゴリに必要な列のみを入力しますか?

ありがとう

更新: キーと値のペアの使用に反対するアドバイスをしているグーグルはたくさんありますが、パフォーマンスの低下にもかかわらず、解決策がここにあることがわかりました: キーと値のペアを格納するテーブルから選択するための MySQL クエリが必要です

4

2 に答える 2

0

私はあなたがあなた自身の質問に答えたと思います。副選択はここで適用できるようです...

SELECT * FROM ADS_DATA WHERE ad_id IN (
    SELECT DISTINCT ad_id FROM ADS_DATA 
    WHERE 
        (ad_data_name = 'Foo' AND ad_data_value = 'Bar') 
    OR 
        (ad_data_name = 'Fizz' AND ad_data_value = 'Buzz')
)

ただし、スキーマは正規化で実行できるようです。キーと値のペアをリレーショナルデータベースに保存するのは、一種の無駄です。

于 2012-10-15T16:40:04.463 に答える
0

ad_data_nameこれは、特定の に対して同じおよびad_data_valueの値を持つ重複する行がないことを前提としていますad_id

select a.*
from ADS_DATA a
inner join (
    select ad_id
    from ADS_DATA
    and (
        (ad_data_name = 'rooms' and ad_data_value = 2) 
        or (ad_data_name = 'size' and ad_data_value = 20)
    ) 
    group by ad_id
    having count(*) = 2
) am on a.ad_id = am.ad_id
where a.ad_id = 1
于 2012-10-15T16:36:03.220 に答える