Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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
具有join和Union All语句的Mysql查询内存不足和超时_Mysql_Mysql Error 1064 - Fatal编程技术网

具有join和Union All语句的Mysql查询内存不足和超时

具有join和Union All语句的Mysql查询内存不足和超时,mysql,mysql-error-1064,Mysql,Mysql Error 1064,我有两个表项目和项目的卖家,每个项目可以在多个卖家 这里我从另一种方法得到ItemId,sellerId的映射,现在我需要所有这些项的详细信息。我至少获得5000个键(sellerId)值(itemId)对,通过使用此映射,我需要从这两个表中获取详细信息 为了在这里获得结果,我使用了以下查询: SELECT table1.column1, table1.column2, table1.column3, table2.column1, table2

我有两个表项目和项目的卖家,每个项目可以在多个卖家

这里我从另一种方法得到ItemId,sellerId的映射,现在我需要所有这些项的详细信息。我至少获得5000个键(sellerId)值(itemId)对,通过使用此映射,我需要从这两个表中获取详细信息

为了在这里获得结果,我使用了以下查询:

SELECT 
    table1.column1, 
    table1.column2, 
    table1.column3, 
    table2.column1, 
    table2.column2 
FROM 
    item as table1 
        INNER JOIN ( 
            select 
                key1 as ITEMID, 
                value1 as SELLERID 
            UNION ALL 
            select 
                key2, 
                value2  
            UNION ALL 
            select 
                key3 , 
                value3  
            UNION ALL 
            select 
                key4 , 
                value4 
            UNION ALL
            // ....5000 key value
            pairs
            ) as KEY_VALUE 
            ON table1.item_id = KEY_VALUE.ITEMID 
        INNER JOIN 
            item_sellers as table2 
            ON table1.item_id = table2.item_id 
            AND table2.seller_id = KEY_VALUE.SELLERID
WHERE table1.active = 1
对于3000-4000个UNION ALL语句,此查询可以正常运行,但对于5000+键值对,即5000+UNION ALL语句,会出现错误,即内存不足异常/查询超时异常

这个查询有什么问题吗?如果是的话,请把灯打开好吗

有没有办法优化这个查询


PS:当我把所有5000个键值对放在这个查询中时,查询字符会变成209950个字符吗?查询是否有字符限制?

您的子查询似乎缺少
from
子句

select 
    key1 as ITEMID, 
    value1 as SELLERID 
UNION ALL 
select 
    key2, 
    value2  
UNION ALL 
// and so on...
它到底是怎么工作的?看起来数据库(出人意料地)正在克服这一点,然后对数据集进行笛卡尔分析——这导致内存急剧增加,无法处理

你应该试试:

select 
    key1 as ITEMID, 
    value1 as SELLERID 
from
    yourTableName
UNION ALL 
select 
    key2, 
    value2
from
    yourTableName
Union all // etc etc

话虽如此,为什么不加入包含where子句的子查询以获取所需的行,或者在它们之间使用查找表呢?

创建一个临时表并插入其中

create temporary table mytable (itemid integer, sellerid integer);
insert into mytable (itemid, sellerid) values
(1,2),(2,10)
;
SELECT 
    table1.column1, 
    table1.column2, 
    table1.column3, 
    table2.column1, 
    table2.column2 
FROM 
    item as table1 
        INNER JOIN mytable as KEY_VALUE 
            ON table1.item_id = KEY_VALUE.ITEMID 
        INNER JOIN 
            item_sellers as table2 
            ON table1.item_id = table2.item_id 
            AND table2.seller_id = KEY_VALUE.SELLERID
WHERE table1.active = 1
;
drop table mytable;

sql字符串长度将小得多。将其放在末尾。

此查询的目的是什么?它看起来很糟糕,应该重写,但我不知道它首先应该做什么。我需要物品和卖家信息,我所拥有的只是一堆物品ID和卖家ID及其映射,即一堆键值对映射。您能建议一下如何重写查询吗?谢谢您的回复,但我没有从任何表中获取key1,value1和key2,value2,我是从另一个业务逻辑中获取的,在运行此查询之前,我会将其保存在映射中,因此,我正在形成一个无from子句的union all查询。@Ranjith虽然我发布了一个答案,但我认为符合您的策略,我猜您所指的业务逻辑是从某个数据库获取数据的。如果这是真的,那么为什么不将业务逻辑转换为sql呢?