虽然表中没有太多产品,但以下查询需要太长时间。 如果我在没有内部联接的情况下查询它,那么每件事情可以请某人帮助找到问题或优化此查询。
SELECT P.ID AS ID,
IFNULL(P.MIN_PRICE, 0) AS PRICE_MIN,
IFNULL(P.MAX_PRICE, 0) AS PRICE_MAX,
IFNULL(P.STORE_COUNT, 0) AS STORE_COUNT,
P.TITLE AS TITLE,
'' AS DETAIL,
P.MANUFACTURER
FROM PRODUCT P
INNER JOIN PRODUCT P1 on (P1.ID=P.PARENT_ID) OR (P.ID=P1.ID) WHERE P.PARENT_ID=0 AND P.ISVALID='Y' AND P1.CATEGORY_ID IN (2040)
这是表结构:
CREATE TABLE IF NOT EXISTS `PRODUCT` (
`ID` int(11) unsigned NOT NULL DEFAULT '0',
`CATEGORY_ID` int(11) unsigned NOT NULL DEFAULT '0',
`TITLE` varchar(255) NOT NULL DEFAULT ' ',
`FILENAME` varchar(255) DEFAULT ' ',
`MANUFACTURER` int(11) unsigned NOT NULL DEFAULT '0',
`EAN_UPC` varchar(100) DEFAULT '',
`MIN_PRICE` decimal(9,2) DEFAULT '0.00',
`MAX_PRICE` decimal(9,2) DEFAULT '0.00',
`STORE_COUNT` int(11) unsigned DEFAULT '0',
`ISVALID` enum('Y','N') NOT NULL DEFAULT 'Y',
`FEATURES_SELECTED` enum('Y','N') NOT NULL DEFAULT 'N',
`PARENT_ID` int(11) DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `IndexCATEGORY_ID` (`CATEGORY_ID`),
KEY `IndexFILENAME` (`FILENAME`),
KEY `IndexMANUFACTURER` (`MANUFACTURER`),
KEY `IndexISVALID` (`ISVALID`),
KEY `IndexCOMP1` (`ID`,`ISVALID`),
KEY `IndexORDER_BY` (`CATEGORY_ID`,`ISVALID`,`STORE_COUNT`),
KEY `IndexTOTAL` (`CATEGORY_ID`,`ISVALID`),
KEY `IndexPARENT_ID` (`PARENT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
编辑: 我尝试将所有产品都放在一个类别或子类别中。有些产品有父母:比如10种不同尺码的牛仔裤。其他人没有父母,但他们也不是孩子(孤儿):说一条没有任何变种的围巾。现在,如果我删除OR我只得到牛仔裤,因为加入的第一个条件得到满足。但它不会归还围巾,虽然它是该类别中的有效产品。
编辑: @BhupeshC这里有一些数据(CATEGORY_ID = 2040):
ID PARENT_ID TITLE
1 0 Dress blue
2 1 Dress blue XS
3 1 Dress blue S
4 1 Dress blue M
5 0 Dress Yellow
6 5 Dress Yellow M
7 5 Dress Yellow L
8 5 Dress Yellow XL
9 0 Scarf men
10 0 Scarf women
其余列可以设置为默认值。 预期结果:
ID PARENT_ID TITLE
1 0 Dress blue
5 0 Dress Yellow
9 0 Scarf men
10 0 Scarf women
编辑:当我查看数据时,我想有人会说只查询parent_id = 0的产品。请不要这样做。因为我刚刚简化了查询。在原始查询中,可以根据只能在子产品上找到的信息过滤数据,但这会使问题更复杂。例如。我想要展示尺寸XL的产品。 但是DrewB的UNION方法可能有用,我只是想看看是否有更好的解决方案。
感谢您的帮助。
答案 0 :(得分:0)
您的问题是内部联接中的OR。它使它成为一个更昂贵的连接。您可以使用EXPLAIN https://dev.mysql.com/doc/refman/5.0/en/using-explain.html查看影响。
答案 1 :(得分:0)
试试这个: -
SELECT P.ID AS ID,
IFNULL(P.MIN_PRICE, 0) AS PRICE_MIN,
IFNULL(P.MAX_PRICE, 0) AS PRICE_MAX,
IFNULL(P.STORE_COUNT, 0) AS STORE_COUNT,
P.TITLE AS TITLE,
'' AS DETAIL,
P.MANUFACTURER
FROM PRODUCT P
LEFT JOIN PRODUCT P1 on (P1.ID=P.PARENT_ID) WHERE P.PARENT_ID=0 AND P.ISVALID='Y' AND P1.CATEGORY_ID IN (2040)