MYSQL SELECT WHERE CLAUSE - исключать строки - PullRequest
0 голосов
/ 13 февраля 2019

В MYSQL, скажем, у меня есть следующие две таблицы.

"заказы":

id   |    name    | customer_id |    type   |  id_fabric
--------------------------------------------------------
1    | "P1601"    |      0      |     1     |    1    
2    | "M6451"    |      0      |     2     |    2    
3    | "T8200"    |      8      |     1     |    1    
4    | "R7441"    |      0      |     2     |    2    
5    | "S8018"    |      2      |     1     |    3    
6    | "P1240"    |      7      |     1     |    3    

"ткани":

id    |  color  |  remaining 
----------------------------
1     | black   |  3.40 
2     | red     |  16 
3     | navy    |  12 

Я хотел бысоздайте запрос, чтобы получить только ткани, у которых осталось больше 5, у которых нет заказов с customer_id = 0 и тип заказа не равен 2

Так что в этом случае результат будет:

id  | color   |  remaining
------------------------------------------------
3   | navy    |  12

Я пытался добиться этого, используя следующий запрос Sql, но он не дает ожидаемого результата:

SELECT
    color,
    remaining
FROM
    fabrics
LEFT JOIN orders ON id_fabric = id
WHERE
    remaining > 2 AND id IN(
    SELECT
        id_fabric
    FROM
        orders
    WHERE
        type != 2 AND customer_id != 0
)
GROUP BY
    id

Есть идеи?

Ответы [ 5 ]

0 голосов
/ 13 февраля 2019

Вы можете попробовать использовать коррелированный подзапрос

SELECT
    color,
    remaining
FROM
    fabrics
LEFT JOIN orders ON id_fabric = id where remaining > 5 and 
not exists (select 1 from orders o where o.id_fabric=fabrics.id and o.customer_id=0 and o.type=2)
0 голосов
/ 13 февраля 2019

Я не думаю, что в этом случае необходимо выбрать подвыбор в вашем состоянии.Вы можете просто пойти дальше, как

SELECT
    color,
    remaining
FROM
    fabrics
LEFT JOIN orders ON id_fabric = id
WHERE
    remaining > 2  
    AND customer_id!=0
    AND type != 0
GROUP BY
    id 
0 голосов
/ 13 февраля 2019

попробуйте, как показано ниже

SELECT
    color,
    remaining
FROM
    fabrics
 JOIN orders ON id_fabric = id
where customer_id!=0 and remaining>5 and type!=2
0 голосов
/ 13 февраля 2019

Использование условий JOIN и WHERE и 'GROUP BY`

id одинаково хранится в обеих таблицах, поэтому используйте имя псевдонима для таблиц.

select f.id,f.color,f.remaining
from fabrics f
join orders o on o.id_fabric  = f.id
where f.remaining > 2 and o.type !=2 and o.customer_id!=0
group by f.id
0 голосов
/ 13 февраля 2019

Использовать NOT EXISTS

SELECT
    f.color,
    f.remaining
FROM fabrics f
WHERE f.remaining > 5 AND 
    NOT EXISTS(
        SELECT 1
        FROM orders o
        WHERE o.id_fabric = f.id AND
              o.type = 2 AND o.customer_id = 0
    )

Обратите внимание, что также JOIN и GROUP BY могут быть исключены из вашего исходного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...