2011-03-29 23 views
0

最初に、私は潜在的に見逃しているタイトルについて謝罪することから始めたいと思います。私がここで何をしようとしているのかを記述するのは難しいです。複数の行を使用したMySQLクエリの検索

私が取り組んでいる現在のプロジェクトでは、MySQLのような「動的な」データベース構造が設定されています。

item_details例えば、私は、私は希望のアイテム12345のアドレスを検索したい場合は、あなたが見ることができるように

fieldID | fieldValue | fieldCaption 

    1 |  addr1 | Address Line 1 

    2 |  country | Country 

item_data

itemID | fieldID | fieldValue 

12345 |  1  | Some Random Address 

12345 |  2  | United Kingdom 

item_dataを記述)単に文を実行します。

SELECT fieldValue FROM item_data WHERE fieldID=1 and itemID=12345;

しかし、ここで私は立ち往生午前ところです...データベースは周り〜80K行と比較的大きく、私はPHP内検索機能のセットを作成しようとしています。

私は可能な限り迅速にクエリの結果セットにクエリを実行できるようにしたいと思い

...

例えば、...特定の国内すなわちアドレス名を検索:検索クエリの結果と同じアイテムIDのと結果のfieldValue:私は不明確だ場合

'SELECT itemID from item_data WHERE fieldID=2 and fieldValue='United Kingdom'..

申し訳ありませんが、私は日の過去のカップルのためにこれで苦労してきた...

乾杯

答えて

1

これはいくつかの方法で実行できます。 1つは、fieldIDを取得したい項目に限定してitem_dataテーブルに複数の結合を使用することです。

SELECT * 
FROM 
Item i 
INNER JOIN item_data country 
ON i.itemID = country.itemID 
    and fieldid = 2 
INNER JOIN item_data address 
ON i.itemID = country.itemID 
    and fieldid = 1 
WHERE 
    country.fieldValue= 'United Kingdom' 
    and address.fieldValue= 'Whatever' 

これは恩着せが聞こえる場合はさておき、この構造は、多くの場合、事前に申し訳Entry Attribute Value or EAVデータベース

+0

私が必要としただけのもの! INNER JOINの特定のフィールドのみを選択する方法はありますか?非常に感謝します..乾杯! – Eddie

+0

@Eddieあなたが望むなら、[インラインビュー](http://www.orafaq.com/wiki/Inline_view)を使うことができます。これは肯定的または否定的な影響を与える可能性がありますので、確実にテストしてください –

+0

私はそれを打つつもりですが、以前の経験によると、最適化には役に立たなかった...乾杯 – Eddie

0

と呼ばれているとしてではなく、(あなたが示唆したように)私は、あなたが求めているものは非常に明確ではありませんよ。

すべてのことを行う1つのクエリを探しているなら、それらを単にネストすることができます。あなたの例では、あなたの英国の質問の結果を持つCACHEDという名前のテーブルがあり、それに対してあなたが望む質問を書きますが、CACHEDをあなたの英国の質問に置き換えます。

このイギリスのクエリを既に実行していて、その結果を使用したいという考えがある場合は、結果をDBのテーブルに保存することができます(実際には大量のクエリを実行した場合)、IDのリストをテキストとして保存し、後続のクエリ(... WHERE ID in(...)...)に貼り付けます。元のテーブルの管理可能な部分を削除します。

関連する問題