Я заранее извиняюсь за длину, решение вполне может быть тривиальным, просто хотел быть максимально информативным.
Таблицы
У меня естьдве таблицы примечаний: предметы и продукты, которые являются отношением 1 ко многим.Один предмет может иметь несколько продуктов, которые являются вариациями цвета и материала.Бренд - это таблица внешних категорий, которая не должна играть большую роль в этом утверждении выбора.
Таким образом, предметом является, например, конкретная обувь, например, обувь "Park Avenue".Продуктом является, например, мерло полированная телячья кожа.И брендом будет просто Аллен Эдмондс.В целом вы получаете обувь Allen Edmonds Park Avenue из полированной телячьей кожи.
Пропущенные результаты поиска "показать почти все"
Кто-то решил создать ручной флаг дляассоциируйте цвет и материал по умолчанию с обувью, чтобы при поиске каждый тип обуви отображался только один раз, а при нажатии на него можно было найти другие цвета и материалы.Это хорошо, но у некоторых ботинок нет материала по умолчанию и набора цвета.К сожалению, те, у кого нет хотя бы одного набора по умолчанию, не отображаются в поиске.
Текущий оператор выбора
Вот текущий выбор, который фильтруетвсе, что не имеет ручной настройки по умолчанию:
SELECT DISTINCT items.ItemId
, items.Name
, items.BrandCategoryId
, items.CatalogPage
, items.GenderId
, items.PriceRetail
, items.PriceSell
, items.PriceHold
, items.Descr
, items.FlagStatus as ItemFlagStatus
, products.ImagetnURL
, products.FlagDefault
, products.ProductId
, products.Code as ProductCode
, products.Name as ProductName
, brands.Name as BrandName
FROM items
, products
, brands
WHERE items.ItemId = products.ItemId
AND items.BrandCode = brands.Code
AND items.FlagStatus != 'U'
AND products.FlagStatus != 'U'
AND products.FlagDefault = 'Y';
Не мой выбор кода, я подозреваю, что часть «DISTINCT» этого утверждения - плохая идея, но я не совсем уверенкак избавиться от этого.
Большая проблема, с которой я сейчас сталкиваюсь, это заключительная строка
AND products.FlagDefault = 'Y'
, которая отфильтровывает все, что не имеет хотя бы одного руководстванабор по умолчанию.
Редактировать: Вот объяснение запроса:
+----+-------------+----------+--------+-----------------------------------------------------------+---------+---------+-------------------------+-------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+--------+-----------------------------------------------------------+---------+---------+-------------------------+-------+--------------------------------+
| 1 | SIMPLE | brands | ALL | NULL | NULL | NULL | NULL | 38 | Using temporary |
| 1 | SIMPLE | products | ALL | FlagStatus,FlagStatus_2,FlagStatus_3,flagstatusanddefault | NULL | NULL | NULL | 16329 | Using where; Using join buffer |
| 1 | SIMPLE | items | eq_ref | PRIMARY,BrandCode,FlagStatus,FlagStatus_2,FlagStatus_3 | PRIMARY | 4 | sherman.products.ItemId | 1 | Using where |
+----+-------------+----------+--------+-----------------------------------------------------------+---------+---------+-------------------------+-------+--------------------------------+
3 rows in set (0.01 sec)
А вот описание продуктов, товаров и брендов:
mysql> describe products;
+-------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+-----------------------------+
| ProductId | int(11) | NO | PRI | NULL | auto_increment |
| ItemId | int(11) | YES | | NULL | |
| Code | varchar(15) | YES | MUL | NULL | |
| Name | varchar(100) | YES | | NULL | |
| MaterialId | int(11) | YES | MUL | NULL | |
| PriceRetail | decimal(6,2) | YES | | NULL | |
| PriceSell | decimal(6,2) | YES | | NULL | |
| PriceHold | decimal(6,2) | YES | | NULL | |
| Cost | decimal(6,2) | YES | | NULL | |
| FlagDefault | char(1) | NO | | N | |
| FlagStatus | char(1) | YES | MUL | NULL | |
| ImagetnURL | varchar(50) | YES | | NULL | |
| ImagefsURL | varchar(50) | YES | | NULL | |
| ImagelsURL | varchar(50) | YES | | NULL | |
| DateStatus | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| DateCreated | timestamp | YES | | NULL | |
+-------------+--------------+------+-----+-------------------+-----------------------------+
16 rows in set (0.02 sec)
mysql> describe items
-> ;
+-----------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+-------------------+-----------------------------+
| ItemId | int(11) | NO | PRI | NULL | auto_increment |
| Code | varchar(25) | YES | | NULL | |
| Name | varchar(100) | YES | MUL | NULL | |
| BrandCode | char(2) | YES | MUL | NULL | |
| CatalogPage | int(3) | YES | | NULL | |
| BrandCategoryId | int(11) | YES | | NULL | |
| TypeId | int(11) | YES | MUL | NULL | |
| StyleId | int(11) | YES | MUL | NULL | |
| GenderId | int(11) | YES | MUL | NULL | |
| PriceRetail | decimal(6,2) | YES | | NULL | |
| PriceSell | decimal(6,2) | YES | | NULL | |
| PriceHold | decimal(6,2) | YES | | NULL | |
| Cost | decimal(6,2) | YES | | NULL | |
| PriceNote | longtext | YES | | NULL | |
| FlagTaxable | char(1) | YES | | NULL | |
| FlagStatus | char(1) | YES | MUL | NULL | |
| FlagFeatured | char(1) | YES | | NULL | |
| MaintFlagStatus | char(1) | YES | | NULL | |
| Descr | longtext | YES | | NULL | |
| DescrNote | longtext | YES | | NULL | |
| ImagetnURL | varchar(50) | YES | | NULL | |
| ImagefsURL | varchar(50) | YES | | NULL | |
| ImagelsURL | varchar(50) | YES | | NULL | |
| DateCreated | date | NO | | 0000-00-00 | |
| DateStatus | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-----------------+--------------+------+-----+-------------------+-----------------------------+
25 rows in set (0.00 sec)
mysql> describe brands;
+--------------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+-----------------------------+
| BrandId | int(11) unsigned | NO | PRI | NULL | auto_increment |
| Code | varchar(6) | YES | | NULL | |
| PriceCode | varchar(4) | YES | | NULL | |
| Name | varchar(50) | YES | | NULL | |
| WebsiteURL | varchar(50) | YES | | NULL | |
| LogoURL | varchar(50) | YES | | NULL | |
| LogoTopURL | varchar(50) | YES | | NULL | |
| BrandURL | varchar(50) | YES | | NULL | |
| Descr | longtext | YES | | NULL | |
| DescrShort | longtext | YES | | NULL | |
| BeltDescr | longtext | YES | | NULL | |
| ImageURL | varchar(50) | YES | | NULL | |
| SaleImageURL | varchar(50) | YES | | NULL | |
| SaleCode | varchar(6) | YES | | NULL | |
| SaleDateBeg | date | YES | | NULL | |
| SaleDateEnd | date | YES | | NULL | |
| FlagStatus | char(1) | YES | | NULL | |
| DateStatus | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| DateCreated | timestamp | YES | | NULL | |
+--------------+------------------+------+-----+-------------------+-----------------------------+
19 rows in set (0.00 sec)
Возможности, которые я изучаю
Подвыбор, который все останавливает
У меня есть оператор выбора, который может, видеальный мир с нулевым временем выполнения, выбирая продукты для первого продуктакаждый элемент, упорядоченный этим полем flagdefault
, например:
AND products.productid =
(select productid
from products
where products.itemid = items.itemid
AND products.FlagStatus != 'U'
order by FlagDefault='Y'
, itemid
limit 1);
, заменяющий проверку для переключаемого вручную значения по умолчанию идентификатором, который упорядочивается только по умолчанию, даже если он не переключен и занимает только первоерезультат.
Этот оператор останавливается и фактически заставляет другое использование сайта переводить операторы mysql в тупик (я полагаю, потому что чтение этих таблиц делает их недоступными в других местах).
Объединение, которое гарантирует, что одна таблица отличается, а не следующая?
Один из способов обойти это, который может сработать, это сделать:
select distinct ItemId from products ORDER BY default
А потом простоИдем дальше, чтобы получить данные для этих предметов, в частности, но я не уверен, как это сделать в одном выражении, не уверен, как правильно объединить select, и я ожидаю, что даже если сделать это выделение «отличным», в первую очередьне идеален, так как он выбирает больше, чем необходимо для начала, а затем сокращает их, но у меня нет лучшей альтернативы дляНа самом деле, окончание различий.
Советы?
В целом, оператор select мог бы принести много улучшений, и, в частности, я мог бы действительно использовать некоторые советы по как отфильтровать результаты для самой конкретной таблицы и только потом присоединить ее к таблице, которая является «единым» в отношении «один ко многим».