2011-06-22 15 views
1

私はこのデータベーススキーマを作成しました。ここにいくつかのユーザーの助けを借りて、ビジネステーブルに格納されたユーザー入力のビジネスエントリを取得するデータベースがあります。 tbl_works_catagoriesテーブル内のcatagoriesテーブルからの約10個のカテゴリーのうちの1つまたはいくつかを、バスIDとカテゴリーIDとを照合することによって決定する。PHP/MySQLリレーショナルデータベーススキーマの検索コードとロジック

は、例えば、BUS_ID 21は今8

CREATE TABLE `business` (
`bus_id` INT NOT NULL AUTO_INCREMENT, 
`bus_name` VARCHAR(50) NOT NULL, 
`bus_dscpn` TEXT NOT NULL, 
`bus_url` VARCHAR(255) NOT NULL, 
PRIMARY KEY (`bus_id`) 
) 

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`) 
) 

CREATE TABLE `tbl_works_categories` (
`bus_id` INT NOT NULL, 
`category_id` INT NOT NULL 
) 

、catagory_id 1、2、5、7と関連付けることができ、私は次のやりたいことをもとに事業を返します。検索機能がありますカテゴリー。たとえば、ビジネステーブルに入力されたビジネスの1つがベーカーズであり、入力されたとき、それはFood(catagory_id 1)およびtake-away(catagory_id 2)の下でカタラーゼに分類されました。

したがって、訪問者は食品カテゴリの下にリストされているビジネスを検索し、私たちのフレンドリー近隣のパン屋に返されます。

すべてのPHP/MySQLと同様に、私はちょうど論理の周りに頭を浮かべることはできません。

答えて

0

テーブルに外部キーを設定して、それらをリンクする必要があります。

CREATE TABLE `business` (
`bus_id` INT NOT NULL AUTO_INCREMENT, 
`bus_name` VARCHAR(50) NOT NULL, 
`bus_dscpn` TEXT NOT NULL, 
`bus_url` VARCHAR(255) NOT NULL, 
PRIMARY KEY (`bus_id`) 
) 

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`) 
) 

CREATE TABLE `tbl_works_categories` (
`bus_id` INT NOT NULL, 
`category_id` INT NOT NULL, 
FOREIGN KEY (`bus_id`) REFERENCES business(`bus_id`), 
FOREIGN KEY (`category_id`) REFERENCES categories(`category_id`) 
) 

次に、検索クエリのようなものになります:あなたが特定のカテゴリに関連するすべての事業をしたい場合は

SELECT b.* 
FROM business b 
    JOIN tbl_works_categories t 
    ON b.bus_id = t.bus_id 
    JOIN categories c 
    ON c.category_id = t.category_id 
WHERE c.category_id = *SOME SEARCH VALUE* 
+0

こんにちは、ありがとう、私は確かに、あなたの*いくつかの検索値*は、私のユーザーの検索やクエリから一致するIDは、明確にするために、これを与える確信しているので、PHPmyadminのtbl_work_catagoriesの外部キーを設定しましたか?ありがとう – Dan

+0

+1外国キーのために。しかし、 'JOIN'を使用するようにクエリを変更し、' WHERE'を使って暗黙的に結合しないようにしてください。それは本当に古い構文です。 –

+0

@Dan、はい、これはユーザーの検索クエリの一致するIDです。 @ypercube、前にJOINをしていない... – Dirk

0

たぶん、あなたはこのような何かしたい:あなたはそれらがこれを行うには、いくつかの方法がありますids-、私はおそらく最も単純に説明します必要があると思いますが

...

SELECT `bus_id` FROM `tbl_works_categories` WHERE `category_id` = *some id from the search* 
     AND `category_id` = *some other id from the search*; 

$ _POSTからカテゴリを取得するので、2つのカテゴリが入力されたとしましょう。 (食べ物とテイクアウト)。しかし、これらを解析するには複数の方法がありますが、要点は$ _POSTから来ているということです。

あなたが見つけるそれぞれのためのこの種のものを実行します。

SELECT `category_id` FROM `categories` WHERE `category_name` LIKE '%*the name from $_POST*%'; 

ストア配列にこれらの結果を...あなたは、私が説明したのと同様に適用クエリを作成することができますどのように多くのあなたがそこに持っているに基づいて、最初。 (ここでは2番目のクエリから> category_idを返すと検出する必要があることを覚えておいてください。)

私はセキュリティのようなことはしません。ユーザーが提出したデータを含む照会を実行します。

別の解決策には、参加が必要な場合があります。私の頭の上にどのように表示されるかわからない場合もあります。

幸運。

+0

@lainwakuraこんにちは、ありがとうございました。 – Dan

0

JOINを使用して
SELECT b.* 
FROM business b, categories c, tbl_works_categories t 
WHERE 
    b.bus_id = t.bus_id AND 
    c.category_id = t.category_id AND 
    c.category_id = *SOME SEARCH VALUE* 

のように書き込まれます-idの場合、SQL文は次のようになります。

SELECT `business`.`bus_name` 
FROM `business` 
WHERE `business`.`bus_id` = `tbl_works_categories`.`bus_id` 
    AND `categories`.`category_id` = `tbl_works_categories`.`category_id` 
    AND `categories`.`category_id` = 1; 

この場合、1はあなたのフードカテゴリですが、ユーザが選択したカテゴリのIDが格納されているPHP変数になる可能性があります。

ヒント:複数のテーブルの名前を必ず複数指定してください。あなたは両方を混ぜて混乱するかもしれません。

+0

ヒントのために感謝ピット(およびクエリのアイデア):) – Dan

+1

問題はありません。単数形か複数形かを問わず、[表命名ジレンマ:単数対複数名](http://stackoverflow.com/questions/338156/table-naming-dilemma-singular-vs-plural-names)を参照してください。 ) – Pit