BG Development


  Reply to this topicStart new topicStart Poll

> SQL join
uphero
Публикувано на: 10-05-2017, 19:28
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 80
Регистриран на: 06.05.15



Сори за тъпото заглавие ама това ми дойде.

Къде бъркам, че ми вади само записи които ги има и в 2-те таблици и flags отговаря на условието което е описано?
Идеята е да провери във 2-та таблица sm_admins кои играчи са записани там с определен флаг и да не ги взема.
Не ми трябва решение a насока къде бъркам.

CODE
SELECT P.steamid, P.name, (P.kill_witch - P.witch_competition) AS witch
FROM players AS P
LEFT JOIN sm_admins AS A ON P.steamid = A.identity
WHERE !(A.flags LIKE '%z%' OR  A.flags LIKE '%b%')
ORDER BY witch DESC
LIMIT 10


Това мнение е било редактирано от uphero на 10-05-2017, 19:32
PMEmail Poster
Top
wqw
Публикувано на: 10-05-2017, 20:12
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 5539
Регистриран на: 10.06.04



При P LEFT JOIN A ако достъпваш колони на A в WHERE с нещо различно от IS NULL все едно не правиш OUTER JOIN. Просто при LEFT JOIN там където от P не се среща в A всички колони от A влизат като NULL, така че няма как предикат WHERE A.Col1 = '123' да е истина защото A.Col1 е NULL, т.е. ако имаш такъв предикат по-добре си ползвай INNER JOIN щото екстра редовете от OUTER JOIN-а си ги "дисквалифицирал" с този предикат.

Затова ако ще тестваш нещо по A, то трябва да го набуташ в ON клаузата на самия LEFT JOIN, а във WHERE клаузата само със IS NULL можеш да тестваш дали отговарят или не на match-ването в ON клаузата.

При тебе става така някак
CODE
SELECT P.steamid, P.name, (P.kill_witch - P.witch_competition) AS witch
FROM players AS P
LEFT JOIN sm_admins AS A ON P.steamid = A.identity
    AND (A.flags LIKE '%z%' OR  A.flags LIKE '%b%')   -- towa go premestihme w ON bez NOT
WHERE A.identity IS NULL                              -- nali identity e PK (not nullable)? samo koito *ne se* match-wat wzimame
ORDER BY witch DESC
LIMIT 10

cheers,
</wqw>

Това мнение е било редактирано от wqw на 10-05-2017, 20:13


--------------------
PMEmail PosterUsers Website
Top
uphero
Публикувано на: 12-05-2017, 17:37
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 80
Регистриран на: 06.05.15



QUOTE (wqw @ 10-05-2017, 20:12)
При P LEFT JOIN A ако достъпваш колони на A в WHERE с нещо различно от IS NULL все едно не правиш OUTER JOIN. Просто при LEFT JOIN там където от P не се среща в A всички колони от A влизат като NULL, така че няма как предикат WHERE A.Col1 = '123' да е истина защото A.Col1 е NULL, т.е. ако имаш такъв предикат по-добре си ползвай INNER JOIN щото екстра редовете от OUTER JOIN-а си ги "дисквалифицирал" с този предикат.

Затова ако ще тестваш нещо по A, то трябва да го набуташ в ON клаузата на самия LEFT JOIN, а във WHERE клаузата само със IS NULL можеш да тестваш дали отговарят или не на match-ването в ON клаузата.

При тебе става така някак
CODE
SELECT P.steamid, P.name, (P.kill_witch - P.witch_competition) AS witch
FROM players AS P
LEFT JOIN sm_admins AS A ON P.steamid = A.identity
    AND (A.flags LIKE '%z%' OR  A.flags LIKE '%b%')   -- towa go premestihme w ON bez NOT
WHERE A.identity IS NULL                              -- nali identity e PK (not nullable)? samo koito *ne se* match-wat wzimame
ORDER BY witch DESC
LIMIT 10

cheers,
</wqw>

Супер,
благодаря ти за изчерпателния отговор!
Всичко е шест, даже оптимизирах няколко заявки по обяснението.
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0