Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用内部联接的MySQL查询需要很长时间_Mysql_Join - Fatal编程技术网

使用内部联接的MySQL查询需要很长时间

使用内部联接的MySQL查询需要很长时间,mysql,join,Mysql,Join,尽管表中的产品不太多,但以下查询花费的时间太长。 如果我在没有内部连接的情况下查询它,一切都很好。请某人帮助查找问题或优化此查询 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.MANUFACTURE

尽管表中的产品不太多,但以下查询花费的时间太长。 如果我在没有内部连接的情况下查询它,一切都很好。请某人帮助查找问题或优化此查询

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种不同尺寸的牛仔裤。其他人没有父母,但他们也不是孩子(孤儿):比如说一条没有任何变体的围巾。现在如果我取下牛仔裤,或者我只得到牛仔裤,因为join中的第一个条件已经满足。但它不会退回围巾,尽管它是该类别的有效产品

编辑: @必和必拓在此提供一些数据(类别ID=2040):

其余列可以设置为默认值。 预期结果:

ID   PARENT_ID TITLE 
1    0         Dress blue
5    0         Dress Yellow
9    0         Scarf men
10   0         Scarf women
编辑:当我查看数据时,我想有人会说只是查询父项id为0的产品。请不要那样做。因为我刚刚简化了查询。在原始查询中,可以根据只能在子产品上找到的信息过滤数据,但这将使问题更加复杂。我只想展示XL码的产品。 但DrewB的联合方法可能有效,我只是想看看是否有更好的解决方案


谢谢您的帮助。

您的问题是内部联接中的OR。这使它成为一个更昂贵的加入。您可以使用EXPLAIN查看影响

试试这个:-

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)

谢谢,但我需要手术室,因为我只想给家长看,但有些产品没有家长。有没有什么方法可以在没有OR的情况下得到我所需要的?如果不了解更多的数据,很难说,但有时你可以使用UNION来删除OR。因此,请编写两个不同的查询(OR的每个部分一个)并合并结果。您能否解释一下您试图执行的操作,以便在没有OR的情况下重新编写此查询?如果我这样做,它将不会返回孤立产品。在这种情况下,我不需要任何连接,一个简单的查询就足够了。如果你能提供一些样本数据和预期的结果集,请?
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)