SELECT displaying products except the results of another SELECT

4

I have this SELECT that takes the 6 best selling products:

SELECT IdProduto, SUM(QtdProdutoPedido) as QtdProdutoPedido FROM tb_pedidoproduto 
GROUP BY IdProduto ORDER BY QtdProdutoPedido DESC LIMIT 6

I wanted a SELECT to show all other products registered except those shown with SELECT above. I tried to use NOT EXIST :

SELECT * FROM 'tb_produto' WHERE NOT EXISTS 
   (SELECT IdProduto, SUM(QtdProdutoPedido) as QtdProdutoPedido FROM tb_pedidoproduto 
     GROUP BY IdProduto ORDER BY QtdProdutoPedido DESC LIMIT 6) 
&& IdCategoria = 2 ORDER BY IdProduto ASC

But I could not mount it. If you have a way to do it in PHP it can be too.

I tried to use NOT EXISTS but it is bringing the results that do not exist in the table tb_pedidproduct, I believe that LIMIT is not working:

SELECT produto.IdProduto, produto.NomeProduto, produto.IdCategoria, produto.Imagem, 
produto.QtdMedida, produto.ValorProduto, produto.IdUnidadeMedida, produto.DescricaoProduto 
FROM tb_produto as produto WHERE produto.IdCategoria = '2' AND NOT EXISTS (
SELECT pedidoproduto.IdProduto, SUM(pedidoproduto.QtdProdutoPedido) as QtdProdutoPedido 
FROM tb_pedidoproduto as pedidoproduto
WHERE produto.IdCategoria = '2' 
AND produto.IdProduto = pedidoproduto.IdProduto 
GROUP BY pedidoproduto.IdProduto ORDER BY QtdProdutoPedido DESC LIMIT 6) 
ORDER BY produto.IdProduto ASC
Basically what I need is to subtract the results of the first SELECT with those of the second one, I tried to do a SELECT using the operand "-" but it did not work as well. Someone help me plss. . .

    
asked by anonymous 15.12.2017 / 19:56

2 answers

3

You can get all the results, EXCEPT the 6 best sellers, using LIMIT with two parameters:

LIMIT 6,18446744073709551615

This will return the query from the 7th record to the last.

Second MySQL Documentation :

  

To retrieve all rows from a certain offset up to the end of the result   set, you can use some large number for the second parameter. This   statement retrieves all rows from the 96th row to the last.

     

SELECT * FROM tbl LIMIT 95,18446744073709551615;

     

Translation: to retrieve all records from a certain point   until the end of the result, you can use a large number in the second   parameter [...]

To sort the result by IdProduto , include , IdProduto after QtdProdutoPedido DESC :

SELECT IdProduto, SUM(QtdProdutoPedido) as QtdProdutoPedido FROM tb_pedidoproduto 
GROUP BY IdProduto ORDER BY
QtdProdutoPedido DESC, IdProduto
LIMIT 6,18446744073709551615
    
16.12.2017 / 15:39
1

According to documentation in version 5.7 (current) of MySQL . There are some errors that only apply to subqueries . The error described by you in the comment is one of them.

  • Syntax not supported on subquery :

    ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message="This version of MySQL does not support 'LIMIT & IN / ALL / ANY / SOME subquery '"

A script used as an example in the documentation is similar to yours:

SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)

In these cases use a comparison attribute between tasks. Porcure use the attribute that relates the two tables to optimize the query.

Your query would look like this:

SELECT * FROM tb_produto AS produto
WHERE
    NOT EXISTS(
        SELECT * FROM tb_pedidoproduto AS pedidoProduto
        WHERE
            pedidoProduto.IdCategoria = 2
                AND pedidoProduto.primaryKeyDaTabela IS NOT NULL
                AND pedidoProduto.IdProduto = produto.IdProduto
        GROUP BY pedidoProduto.IdProduto
        ORDER BY COUNT(pedidoProduto.QtdProdutoPedido) DESC
        LIMIT 5
    );

Note: I added the line AND pedidoProduto.primaryKeyDaTabela IS NOT NULL because primaryKeyDaTabela can be null and return false . As a consequence, the count() will count all the 'false' together. This will be wrong information for the superiror script to make the decision which product to bring. For this reason the solution was add NOT NULL to the returns of primaryKeyDaTabela .

You can run a test and run SELECT within NOT EXISTS () separated. So you can check if any IdProduto will return as null

Any questions or errors please comment there

    
16.12.2017 / 13:51