と交差し、私はどのようにフレーズの質問には本当にわからないんだけど、そう私はちょうど問題の例をあげてみましょう:PHP/MySQLの:多対多/テーブルの質問
項目をマッピングするテーブルがありますと仮定カテゴリに。各項目は任意の数のカテゴリを持つことができ、各カテゴリは任意の数の項目を保持することができます。
items_categories
問題があるが、私は特定のカテゴリのIDを持つすべてのアイテムのIDを選択するようにしたいのidのitem_id CATEGORY_ID:だから、このようになりますテーブルを持っています。たとえば、category_idが1と2のitem_idをすべて選択します。1と2の両方のカテゴリに関連付けられているすべての項目を検索したいと思います。明らかにAND文は使用できません。また、OR文はどちらのカテゴリ必ずしも両方である必要はない。
これは私の考えであり、私が考えることができる最高のものです:category_idが1または2に等しいすべてのitem_idsを選択してください。 PHPの結果を繰り返し、category_idに関連付けられているitem_idの数を追跡します。指定された数のカテゴリを持たない結果のitem_idをすべて解除します。ここに私のコードの抜粋です:
// assume $results is an array of rows from the db
// query: SELECT * FROM items_categories WHERE category_id = 1 OR category_id = 2;
$out = array();
foreach ($results as $result)
{
if (isset($out[$result['item_id']]))
$out[$result['item_id']] ++;
else
$out[$result['item_id']] = 1;
}
foreach ($out as $key=>$value)
{
if ($value != 2)
unset($out($key));
}
return array_keys($out); // returns array of item_ids
を明らかにあなたはさまざまなカテゴリの多くを持っている場合、あなたは理論的にする必要がある場合よりも、より多くの情報を選択し、処理の方法です。何か案は?
ありがとうございます!
編集:ここでははテーブルと私はそれから必要な情報の例です:
だから、私はどのように私は、カテゴリ1とすべての項目を得ることに興味があると言うと2カテゴリ#1 と#2のアイテムのみを欲しいとすれば、サンプルテーブルからアイテム#1を取得しますか?上記の例のようにカテゴリ1 または 2をすべて選択すると、カテゴリ1とカテゴリ2の両方に関連付けられていないため、この場合はテーブル全体を選択してitem_id 2と3を手動で削除する必要があります。カテゴリ2は少し明確にするのに役立ちます。
最終編集:私がやろうとしていることを明らかにすることができないにもかかわらず、私はそれを理解しました。
SELECT *
FROM
(
SELECT item_id, COUNT(*) as count
FROM items_categories
WHERE category_id IN (1, 2)
GROUP BY item_id
) table_count
WHERE count = 2;
この場合は、 "(1、2)" "( category_id1、 category_id2、...)" で置き換えることができます:ここではレコードの私が思い付いたクエリは、です最後の「2」は検索しているカテゴリの数で置き換えられます。
したがって、各アイテムの基準に一致するカテゴリの数がわかります。すべてのカテゴリが一致するアイテムのみが必要なので、カテゴリの数が探しているカテゴリの数と等しいものだけを選択します。これはもちろん、重複したカテゴリやそのようなものがないと仮定しています。
ありがとうございました!
感謝。つまり、私は結果から特定の価値を探しているわけではありません。結果から各項目がどのように関連しているかを知りたいだけです。その番号が検索しているカテゴリの数と異なる場合は、そのカテゴリにすべてのカテゴリが含まれていないことがわかります。私がこれを正しく理解しているならば、バイナリ検索は実際にはこれを達成できないと思います。特定の値を探しているわけではないからです。 – user599599
ところで、元の投稿を編集して、もう少し明確にすることを願っています。 – user599599