Dziwny problem z zapytaniem :/

0

Jest sobie takie zapytanie które ładnie zbiera dane z paru tabel:

SELECT
    zlecenia.id,
    zlecenia.numer_zam AS nr_zlecenia,
    zlecenia.data_przyjecia AS data_zlec,
    kontrahenci.skrot AS zleceniodawca,
    CONCAT(osoby.imie, ' ', osoby.nazwisko) AS ImieNazwiskoZlec,
    dok_zl.typ,
    CONCAT(
        osoby_dok.imie,
        ' ',
        osoby_dok.nazwisko
    ) AS ImieNazwiskoOdb,
    kontrahenci_dok.skrot AS zleceniobiorca,
    dok_zl.data_wysl,
    uzytkownicy.ImieNazwisko AS tworca
FROM
    zlecenia
INNER JOIN dok_zl ON dok_zl.id_zam = zlecenia.id
INNER JOIN osoby ON zlecenia.nazwa_klienta = osoby.id
INNER JOIN kontrahenci ON kontrahenci.id = osoby.id_kontrah
INNER JOIN osoby AS osoby_dok
ON
    osoby_dok.id = dok_zl.kontrahent
INNER JOIN kontrahenci AS kontrahenci_dok
ON
    kontrahenci_dok.id = osoby_dok.id_kontrah
INNER JOIN uzytkownicy ON dok_zl.id_user = uzytkownicy.login

Ale próbując dołożyć prosty warunek - WHERE dostaję nie zrozumiały dla mnie błąd :/
Poniżej przykład i błąd:

SELECT
    zlecenia.id,
    zlecenia.numer_zam AS nr_zlecenia,
    zlecenia.data_przyjecia AS data_zlec,
    kontrahenci.skrot AS zleceniodawca,
    CONCAT(osoby.imie, ' ', osoby.nazwisko) AS ImieNazwiskoZlec,
    dok_zl.typ,
    CONCAT(
        osoby_dok.imie,
        ' ',
        osoby_dok.nazwisko
    ) AS ImieNazwiskoOdb,
    kontrahenci_dok.skrot AS zleceniobiorca,
    dok_zl.data_wysl,
    uzytkownicy.ImieNazwisko AS tworca
FROM
    zlecenia
INNER JOIN dok_zl ON dok_zl.id_zam = zlecenia.id
INNER JOIN osoby ON zlecenia.nazwa_klienta = osoby.id
INNER JOIN kontrahenci ON kontrahenci.id = osoby.id_kontrah
INNER JOIN osoby AS osoby_dok
ON
    osoby_dok.id = dok_zl.kontrahent
INNER JOIN kontrahenci AS kontrahenci_dok
ON
    kontrahenci_dok.id = osoby_dok.id_kontrah
INNER JOIN uzytkownicy ON dok_zl.id_user = uzytkownicy.login
WHERE ImieNazwiskoZlec LIKE '%a%'

i błąd:

#1054 - Nieznana kolumna 'ImieNazwiskoZlec' w  where clause

Gdzie robię błąd :(

Pozdrawiam
Torin

edit:
Częściowo rozwiązany - w WHERE stosujemy nazwy kolumn nie aliasy. Moja skleroza.
Ale
Czy w takim razie WHERE nie ma zastosowania w kolumnach złożonych z dwóch pól CONCAT-em ?

0

Możesz zawsze zrobić WHERE CONCAT(...

0

Problem jest w tym że SELECT jest wykonywany po WHERE, więc w WHERE nie możesz się odwoływać do rzeczy zdefiniowanych w SELECT bo one jeszcze nie istnieją.

tutaj możesz więcej o tym poczytać:
https://www.designcise.com/web/tutorial/what-is-the-order-of-execution-of-an-sql-query

0

Możesz również opakować twój select w zapytanie nadrzędne i posługiwać się wcześniej ustawionymi aliasami:

SELECT t.* FROM 
(SELECT
    zlecenia.id,
    zlecenia.numer_zam AS nr_zlecenia,
    zlecenia.data_przyjecia AS data_zlec,
    kontrahenci.skrot AS zleceniodawca,
    CONCAT(osoby.imie, ' ', osoby.nazwisko) AS ImieNazwiskoZlec,
    dok_zl.typ,
    CONCAT(
        osoby_dok.imie,
        ' ',
        osoby_dok.nazwisko
    ) AS ImieNazwiskoOdb,
    kontrahenci_dok.skrot AS zleceniobiorca,
    dok_zl.data_wysl,
    uzytkownicy.ImieNazwisko AS tworca
FROM
    zlecenia
INNER JOIN dok_zl ON dok_zl.id_zam = zlecenia.id
INNER JOIN osoby ON zlecenia.nazwa_klienta = osoby.id
INNER JOIN kontrahenci ON kontrahenci.id = osoby.id_kontrah
INNER JOIN osoby AS osoby_dok
ON
    osoby_dok.id = dok_zl.kontrahent
INNER JOIN kontrahenci AS kontrahenci_dok
ON
    kontrahenci_dok.id = osoby_dok.id_kontrah
INNER JOIN uzytkownicy ON dok_zl.id_user = uzytkownicy.login) t
WHERE t.ImieNazwiskoZlec  LIKE '%a%'

Nie testowałem ale powinno działać.
Pomijam także kwestię wydajności takiego wyszukiwania.

0

Ostatnie rozwiązanie zacne - ale obawiam się, że jakby klientowi baza urosła (a są na to widoki) to wy to odczuł ;)
Problem "obejdziety" poprzez przeszukiwanie oddzielnie imienia oddzielnie nazwiska.
Zaakceptowane przez odbierającego - to najważniejsze.
Moja wina moja bardzo wielka wina za sklerozę w kwestii kolejności klauzur.
Dzięki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1