1

私はこれをあまりにも長い間見てきたので、ロジックのすべての容量を失いました. ポインター/ヘルプは大歓迎です。

以下のように 3 つのテーブルがあり、重要な列があります。

表: カテゴリ

+------+--------------+
| | 猫ID | 猫の名前 |
+------+--------------+
| | 1 | 誰かの名前 |
| | 2 | 文字列名 |
| | 3 | サードキャット |
| | 4 | ストリングキャット |
| | 5 | ストリングその他 |
| | 6 | シックスキャット |
+------+--------------+

表: 製品

+-----+------+
| | pID | pCat |
+-----+------+
| | 22 | 1 |
| | 33 | 1 |
| | 44 | 7 |
| | 55 | 9 |
+-----+------+

表: 製品

+-----+-------+
| | pID | 猫ID |
+-----+-------+
| | 22 | 2 |
| | 22 | 6 |
| | 33 | 3 |
| | 33 | 5 |
| | 44 | 3 |
| | 44 | 6 |
| | 55 | 5 |
| | 55 | 6 |
+-----+-------+

カテゴリ ID のリストがあります。このリストを使用して、catName に特定の文字列を含むカテゴリを返す必要があります。

(カテゴリから) 次の場合に、このリストにカテゴリを追加します。

catName LIKE %string% AND catID IN ($mycats) 

明らかに問題はありません。

ただし、カテゴリ 2 と 5 (「文字列」を含む) も返す必要がありますが、それらが (prodcats で) 2catID 1 の製品に関連している場合のみです。

そこで頭が壊れました。

次のことを知っておくと役立つ場合があります。

  • $mycats の ID は、製品テーブルの pCat として発生する場合と発生しない場合があります。
  • $mycats には 1 つまたは 2 つの項目しかありません。2 つある場合、1 つは探している文字列を名前に含む猫であり、2 つ目は決してありません。

編集: - これを明確にするために、上記のサンプル テーブル データと以下の例を追加しました。

例: $mycats=1,4

catID 4 を取得する必要があります。その名前には両方とも「string」が含まれています。それは簡単なビットです。

しかし、catID 2 と 5 も取得したいと考えています。これらにも文字列が含まれており、$mycats にはありませんが、製品の catID 1 にあるテーブル prodcats の pID に関連付けられているためです。

それが少し明確になることを願っています。この時点で、私には泥のようなものです。

4

2 に答える 2

1

要件に含まれる二次カテゴリ ID は、次のように表すことができます。

select c.*
from Product p
join Prodcats pc on pc.pID = p.pID
join Categories c on c.catID = pc.catId and c.catName like '%string%'
where pCat in (1,4)

これunionで、元のクエリで次のようになります。

select *
from Categories = pc.catId 
where catID in (1,4)
and c.catName like '%string%'
union
select c.*
from Product p
join Prodcats pc on pc.pID = p.pID
join Categories c on c.catID = pc.catId and c.catName like '%string%'
where pCat in (1,4)

ノート:

  • union重複は自動的に削除されるため、distinct. (union all重複を保持します)
  • このクエリは非常にうまく機能するはずです - カテゴリへの 2 つのパスは別のクエリにあるため、最適化は良好です
  • カテゴリ名の条件は結合のon句にあります。これは、そのような句は結合が行われるときに実行されるためです。一方、条件を句に入れると、可能なすべての結合が行われた後whereに実行されます。これは、より多くの結合が行われることを意味します。結論:この方法の方がはるかに高速です
于 2012-10-15T16:02:56.747 に答える
0

わかりました、私あなたが何を求めているかを理解したと思います。

コツは後ろ向きで作業することです。最初に、製品を介してリンクされているカテゴリを取得します (associatedCategories以下の派生テーブルを使用して選択)。次に、文字列に一致するカテゴリに対して再び結合します。

select * from
categories
inner join (
    select catID from
    products
    inner join prodcats on products.pID = prodcats.pID
    where
    pCat in (1,4)
) associatedCategories on categories.catID = associatedCategories.catID
where catName LIKE '%string%';
于 2012-10-15T15:48:00.987 に答える