Я присоединяюсь к 3 таблицам. последний содержит несколько фотографий на предмет. Идея состоит в том, чтобы получить одну запись для каждого предмета, и только одна фотография была выбрана случайным образом.
ЗАКАЗ меняется, ГДЕ меняется.
Лучшее, что я мог получить, это подзапрос. Есть более эффективный способ сделать это?
SELECT *
FROM (
SELECT *
FROM art
LEFT JOIN prov USING ( provID )
LEFT JOIN photos USING ( artID )
WHERE artBrand = "Shimano" AND catID=5 AND (stock1>0 OR stock2>0) AND itemName LIKE "%20mm%"
//the WHERE changes wildly, this is only an example
ORDER BY rand( ) // sometimes is rand, sometimes price, sometimes stock...
)rand
GROUP BY artID // this is the only reasonable way i've got so far to avoid duplicates when an article has more than 1 photo
LIMIT x // меняется, иногда мне нужно показать все статьи, которые соответствуют поисковому запросу, иногда мне нужно всего несколько (5 или 10)
Важно: этот запрос РАБОТАЕТ. Но мне нужен более эффективный способ сделать это. Подзапросы очень дороги.
Обновление:
- Мне нужно другое фото каждый раз
- Я ищу самый быстрый запрос (в этом суть моего вопроса).
- Сортировка товаров различается, иногда мне нужно использовать цену, иногда название, иногда случайное ...
- В некоторых статьях нет фотографии, поэтому я использую левое соединение. Я не могу их выпустить.
- Некоторые статьи имеют 10, 15 или даже 20 фотографий.
- Но в некоторых случаях мне нужно показать только с сочленением с фотографией
- ГДЕ может иметь до 20 условий и быть очень сложным. Это только упрощение.
Упрощенные структуры таблиц:
Table art
artID: int
artName: varchar
artBrand: varchar
artPrice: decimal
provID: int
photo: int (when there is at least one available photo this is set to 1)
many more rows
Table prov
provID: int
provName: varchar
many more rows
Table photos
artID: int
thumb: varchar
normal: varchar
big: varchar
nothing fancy