www.state-it.info

Gran base de respuestas a las preguntas de los desarrolladores
Header decor

Como hacer esta consulta correctamente?

vism 2017-11-17 17:07:58

le ha Dado. (despojada versión)
Orders:
id
OrderProducts:
id
order_id
product_id
delivery_complete
Products:
id
category_id

En ambas situaciones OrderProducts no deben урезаться de la muestra(join) como en la del coste общенй cantidad, etc.
1) el texto
Es necesario obtener todos los pedidos de todos los productos delivery_complete=1
2) complejo opción
una condición fundamental para el pedido de todos los productos con products.`category_id` != 9 se orders_products.delivery_complete = 1
y al menos un
orders_products.delivery_complete = 0 AND products.`category_id` = 9

Decidió pregunta(difícil), pero este comentario descuidado

SELECT 
  `orders`.*,
  `products_count`,
  `products_available`,
  `products_ek_count`,
  `products_ek_sum`,
  `products_in_stock`,
  (SELECT 
    COUNT(orders_products.id) 
  FROM
    orders_products 
    LEFT JOIN products 
      ON orders_products.`products_id` = products.id 
  WHERE orders_products.orders_id = `orders`.`id` 
    AND orders_products.delivery_complete = 1 
    AND products.`category_id` != 9) AS delivery_complete_not_ww_products,
  (SELECT 
    COUNT(orders_products.id) 
  FROM
    orders_products 
    LEFT JOIN products 
      ON orders_products.`products_id` = products.id 
  WHERE orders_products.orders_id = `orders`.`id` 
    AND products.`category_id` != 9) AS not_ww_products 
FROM
  `orders` 
  INNER JOIN `orders_products` 
    ON `orders_products`.`orders_id` = `orders`.`id` 
  INNER JOIN `products` 
    ON `orders_products`.`products_id` = `products`.`id` 
  INNER JOIN 
    (SELECT 
      orders_id,
      COUNT(id) AS products_count,
      SUM(delivery_complete) AS products_available,
      SUM(ek) AS products_ek_sum,
      SUM(IF(in_stock > 0, 1, 0)) AS products_in_stock,
      SUM(IF(ek > 0, 1, 0)) AS products_ek_count 
    FROM
      orders_products 
    GROUP BY orders_id) AS sq_products_count 
    ON `orders`.`id` = `sq_products_count`.`orders_id` 
GROUP BY `orders`.`id`,
HAVING delivery_complete_not_ww_products = not_ww_products 
  AND products_count > not_ww_products 
  AND products_count > products_available 
  AND not_ww_products > 0


UPDATE
una opción fácil de listo
SELECT 
  `orders`.* 
FROM
  `orders` 
  INNER JOIN `orders_products` ON `orders_products`.`orders_id` = `orders`.`id` 
  INNER JOIN `products` ON `orders_products`.`products_id` = `products`.`id` 
WHERE `orders`.status NOT IN ('ERLEDIGT', 'STORNO') 
  AND orders.id IN (SELECT `orders_id` 
    FROM `orders_products`
    INNER JOIN `products` ON `orders_products`.`products_id` = `products`.`id`  
    WHERE orders_products.delivery_complete = 1 AND products.`category_id` != 9) 
GROUP BY `orders`.`id`


Pero ahora es necesario agregar una condición compleja de la opción

resulta obligatorio para el pedido de todos los productos con products.`category_id` != 9 se orders_products.delivery_complete = 1
y al menos un
orders_products.delivery_complete = 0 AND products.`category_id` = 9

Total answers: 2

Rsa97 2017-11-17 17:17:04

SELECT *
  FROM (
    SELECT `id` 
      FROM `Orders` 
      WHERE `id` NOT IN (SELECT `order_id` FROM `OrderProducts` WHERE `delivery_complete` != 1)
  ) AS `o`
  JOIN `OrderProducts` AS `op` ON `op`.`order_id` = `o`.`id`
  JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`

En consecuencia, cambia la condición en NOT IN, de modo que en una SELECT se seleccionaron aquellos productos que NO cumplan con la condición.

vism 2017-11-17 18:18:30

Gracias, en el correcto lecho me di la vuelta.
Esto es lo que me ha resultado (versión simple de un)

SELECT 
  `orders`.* 
FROM
  `orders` 
  INNER JOIN `orders_products` ON `orders_products`.`orders_id` = `orders`.`id` 
  INNER JOIN `products` ON `orders_products`.`products_id` = `products`.`id` 
WHERE `orders`.status NOT IN ('ERLEDIGT', 'STORNO') 
  AND orders.id IN (SELECT `orders_id` 
	  FROM `orders_products`
	  INNER JOIN `products` ON `orders_products`.`products_id` = `products`.`id`  
	  WHERE orders_products.delivery_complete = 1 AND products.`category_id` != 9) 
GROUP BY `orders`.`id`


Pero no puedo pensar en cómo agregar una segunda condición
Para cuando en el pedido fue al menos un producto, con la categoría de 9 y delivery_complete=0
Es decir aquí se necesita de palabras y сранение de él, si lo entiendo correctamente..


vism 2017-11-17 18:30:49

Maldita sea, no la precisión en формулеровке tenía
para el simple(y como parte de un complejo)
Es necesario mostrar los pedidos de los que todos los productos cumplen con la condición de orders_products.delivery_complete = 1 AND products.`category_id` != 9
Es decir, si en el pedido de un producto products.`category_id` != 9 y orders_products.delivery_complete = 0. No mostrar. Probablemente este es el mayor problema para mí


Rsa97 2017-11-17 20:59:04

vism, y poner en la condición de adjunto SELECT'a lo que no quieras que aparezca.


vism 2017-11-17 21:19:51

Rsa97, no es así.
el significado es, que si el pedido de 5 productos
4 tienen la categoría de 5 y entregados
1 tiene la categoría de 9 y no entregado
lo elegimos este pedido

y si
4 tienen la categoría de 5 pero 1 no entregado

no mostramos.


Rsa97 2017-11-17 21:31:04

vism, es decir, el producto debe ser entregado, o tener el noveno lugar de la categoría. Es decir,

`OrderProducts`.`delivery_complete` = 1 || `products`.`category_id` = 9
Anotamos la negación de la:
!(`OrderProducts`.`delivery_complete` = 1 || `products`.`category_id` = 9) => 
!(`OrderProducts`.`delivery_complete` = 1) && !(`products`.`category_id` = 9) =>
`OrderProducts`.`delivery_complete` != 1 && `products`.`category_id` != 9
Y escriba esto en la condición de
...
      WHERE `id` NOT IN (
        SELECT `op`.`order_id` 
          FROM `OrderProducts` AS `op`
          JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`
          WHERE `op`.`delivery_complete` != 1 AND `p`.`category_id` != 9)
...


vism 2017-11-17 21:40:01

Rsa97, No funciona
eso es lo que yo y no sé cómo hacer en SQL
Por su condición de recibiré el pedido, si al menos un producto entregado o tiene la categoría 9

Y la necesidad de obtener la orden si todos los 4 productos de la categoría !=9 entregado y al menos una con la categoría de 9 no entregado.

Y yo lo заговнокодил así, pero es lento y no es flexible

HAVING delivery_complete_not_ww_products = not_ww_products 
  AND products_count > not_ww_products 
  AND products_count > products_available 
  AND not_ww_products > 0


Rsa97 2017-11-17 21:48:52

vism, la Condición

WHERE `op`.`delivery_complete` != 1 AND `p`.`category_id` != 9
selecciona todos los productos no entregados, no de la novena categoría, y WHERE `id` NOT IN (SELECT ...), para darse, todos los pedidos, donde estos productos no. Una solicitud completa:
SELECT *
  FROM (
    SELECT `id` 
      FROM `Orders` 
      WHERE `id` NOT IN (
        SELECT `op`.`order_id` 
          FROM `OrderProducts` AS `op`
          JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`
          WHERE `op`.`delivery_complete` != 1 AND `p`.`category_id` != 9)
  ) AS `o`
  JOIN `OrderProducts` AS `op` ON `op`.`order_id` = `o`.`id`
  JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`


vism 2017-11-18 15:14:34

Rsa97, Gracias, a la mente ha comprendido.
NOT IN (`op`.`delivery_complete` != 1 AND `p`.`category_id` != 9) no es lo mismo que IN (`op`.`delivery_complete` = 1 OR `p`.`category_id` = 9)

Su consulta casi lo que se necesita.
Pero, de nuevo shchas estaba pensando y no ha inventado..
En su petición, se caen todos los productos entregados con la categoría de no 9.
De alguna manera debía agregar una condición que debe ser entregado el producto con la categoría de 9.

Es decir, la exclusión de la muestra es necesario agregar la condición de que la cantidad entregada es igual al total pocos granos de los productos del pedido?

SELECT `op`.`order_id` 
          FROM `OrderProducts` AS `op`
          JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`
          WHERE `op`.`delivery_complete` != 1 AND `p`.`category_id` != 9
                    AND
               (
		SELECT COUNT(`op1`.id)
		FROM `OrderProducts` AS `op1`
		JOIN `Products` AS `p` ON `p`.`id` = `op1`.`product_id`
		WHERE `op1`.`delivery_complete` = 1 AND `op`.orders_id = op1`.orders_id
		) = (
		SELECT COUNT(`op2`.id)
		FROM `OrderProducts` AS `op2`
		JOIN `Products` AS `p` ON `p`.`id` = `op2`.`product_id`
		WHERE `op`.orders_id = op1`.orders_id
		)


Pero этож delirio sí y no валидно.
Pero como de lo contrario, esto se hace?


Rsa97 2017-11-18 15:57:21

vism, Prueba, para empezar, el ruso lo más sencillo posible, para entender cualquiera de expresar la exigencia a la muestra. Por lo tanto:
En la muestra deben caer todos los pedidos en los que ...


vism 2017-11-18 17:18:10

en el que todos los productos con una categoría distinta de la de 9 entregados
y al menos una con la categoría de 9 no entregado.

La primera condición ha ayudado a hacer, y cómo agregar el segundo no puedo darme cuenta.


Rsa97 2017-11-18 17:28:09

SELECT *
  FROM (
    SELECT `id` 
      FROM `Orders` 
      WHERE `id` IN (
        SELECT `op`.`order_id` 
          FROM `OrderProducts` AS `op`
          JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`
            AND `op`.`delivery_complete` != 1 AND `p`.`category_id` = 9
        ) AND `id` NOT IN (
        SELECT `op`.`order_id` 
          FROM `OrderProducts` AS `op`
          JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`
            AND `op`.`delivery_complete` != 1 AND `p`.`category_id` != 9
        )
  ) AS `o`
  JOIN `OrderProducts` AS `op` ON `op`.`order_id` = `o`.`id`
  JOIN `Products` AS `p` ON `p`.`id` = `op`.`product_id`


vism 2017-11-18 18:10:34

Rsa97, todo como debe ser.
Muchas gracias por tantas уделенного tiempo.

Todo es muy simple y elegante resulta.
Desde su punto de vista de mis errónea manera de pensar rara causada por la práctica de SQL o débiles de los conocimientos en el álgebra de la lógica?


Rsa97 2017-11-18 18:20:43

vism, En mi opinión, le falta experiencia en la formalización de las tareas, es decir, la presentación en forma inequívoca el conjunto de términos o expresiones.


vism 2017-11-18 18:21:58

Rsa97,
A juzgar por lo que su consulta todas básico de MySql, el problema en el álgebra de la lógica.

Gracias por la ayuda.


BojackHorseman 2017-11-17 17:18:24

si he entendido la pregunta, es necesario seleccionar todos los órdenes de la categoría de 9 y sólo se han entregado (delivery_complete=1) de cualquier otra

SELECT
 OrderProducts.*
FROM OrderProducts, Products
WHERE Products.id = OrderProducts.product_id
AND ((Products.category_id <> 9 AND OrderProducts.delivery_complete=1) OR (Products.category_id = 9))

vism 2017-11-17 18:00:16

no.
Shaofeng fue tan banal

Es necesario seleccionar todos los pedidos con productos de la categoría !=9 entregados a los productos de la categoría de 9 de entrega o no entregados. No cortar con una muestra de приджойненые productos.
Es decir, en cualquier подзапросом


BojackHorseman 2017-11-17 18:16:35

y donde que рубится?) la relación Products.id = OrderProducts.product_id no 1 a 1? la integridad referencial de la base no se rompe?


vism 2017-11-17 18:23:09

BojackHorseman, Mm, bueno sí, el muestreo no de pedidos ya.
Es usted de inmediato una subconsulta накидали.
Me di cuenta de.

Lo siento, no era preciso en la condición de una consulta compleja, actualizada por la pregunta.

eso es lo que tengo hasta el momento ha resultado

SELECT 
  `orders`.* 
FROM
  `orders` 
  INNER JOIN `orders_products` ON `orders_products`.`orders_id` = `orders`.`id` 
  INNER JOIN `products` ON `orders_products`.`products_id` = `products`.`id` 
WHERE `orders`.status NOT IN ('ERLEDIGT', 'STORNO') 
  AND orders.id IN (SELECT `orders_id` 
    FROM `orders_products`
    INNER JOIN `products` ON `orders_products`.`products_id` = `products`.`id`  
    WHERE orders_products.delivery_complete = 1 AND products.`category_id` != 9) 
GROUP BY `orders`.`id`


vism 2017-11-17 18:27:01

BojackHorseman,
Una vez más переформулировал

resulta obligatorio para el pedido de todos los productos con products.`category_id` != 9 se orders_products.delivery_complete = 1
y al menos un
orders_products.delivery_complete = 0 AND products.`category_id` = 9


BojackHorseman 2017-11-17 19:55:45

vism, bueno, entonces es simple) es un operador exists) se óptimas que where in <subquery>, porque funciona a фетча el primer resultado de la subconsulta


vism 2017-11-17 20:18:09

BojackHorseman, dik.. Y como escribir хотяб simple,
para el pedido de todos los productos con products.`category_id` != 9 se orders_products.delivery_complete = 1


vism 2017-11-18 22:24:35

BojackHorseman,
Gracias, aplicado EXISTS el hecho de que получилос y se ha convertido en un 30% más rápido)


Preguntas relacionadas:

Footer decor

© www.state-it.info | Base of answers to questions for developers and programmers.