例として以下の表を使用し、リストされたクエリをベースクエリとして使用して、最大IDを持つ行のみを選択する方法を追加します。 2番目のクエリを実行する必要はありません!MySQLは最大IDを持ち、他の条件と一致する行を選択します
TABLE VEHICLES
id vehicleName
----- --------
1 cool car
2 cool car
3 cool bus
4 cool bus
5 cool bus
6 car
7 truck
8 motorcycle
9 scooter
10 scooter
11 bus
TABLE VEHICLE NAMES
nameId vehicleName
------ -------
1 cool car
2 cool bus
3 car
4 truck
5 motorcycle
6 scooter
7 bus
TABLE VEHICLE ATTRIBUTES
nameId attribute
------ ---------
1 FAST
1 SMALL
1 SHINY
2 BIG
2 SLOW
3 EXPENSIVE
4 SHINY
5 FAST
5 SMALL
6 SHINY
6 SMALL
7 SMALL
とベースクエリ:
select a.*
from vehicle a
join vehicle_names b using(vehicleName)
join vehicle_attribs c using(nameId)
where c.attribute in('SMALL', 'SHINY')
and a.vehicleName like '%coo%'
group
by a.id
having count(distinct c.attribute) = 2;
それでは、私が達成したいことは、特定の属性を持つ行を選択することで、名前が、IDがどこにあるかと一致する名前ごとに一つだけのエントリと一致最高!
したがって、この例ではワーキング溶液は、以下の行を返します:
id vehicleName
----- --------
2 cool car
10 scooter
それは現時点ではID
上の最大のいくつかの並べ替えを使用していた場合、私はクールな車のためのすべてのエントリを取得しますスクーター。
私の実際のデータベースは、同様の構造に従っており、数千ものエントリを持っているので、上記のようなクエリは3000以上の結果を簡単に返すことができます。結果を自分のサイトの検索で使用するため、実行時間を低く抑えるために結果を100行に制限します。私が同じ名前でIDが異なる "車両"を繰り返しているのは、常に新しいモデルが追加されているからです。しかし、車名での検索では、古いカードをIDの最も高いものだけ戻したくない!
正解は、私が現在使用しているクエリを適合させ、名前が一致する行だけを返しますが、最も高いIDを持ちます。
これが不可能な場合は、検索の実行時間を大幅に増やすことなく、私が望むものをどのように達成できるかについての提案をいただければ幸いです。
あなたは ''(名前ID、属性)にvehicle_attribs' 'にインデックスを持っていますか? 'LIKE '%cool%''を使ってvehicle_namesを検索するとインデックスが使われない – ajreal
@ajreal vehicle_attribsの(nameId、attribute)にPRIMARY KEYがあります。 – Tristan