Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Dynamiczne szukanie. Niby proste ale..
Forum PHP.pl > Forum > Przedszkole
www.aukcje.fm
Witam,

Jest problem z zapytaniem (jednym) aby wyłowić te numery id w których występują określone value

ID|VALUE
1|a
1|b
1|c
2|a
2|b
3|a
3|b
3|c
4|z

Czyli wybierz takie numery ID w których występuje a, b, c lub wybierz takie w których występuje a i b.
Oczywiście dla jednego value nie ma problemu.
Użycie "i" odpada. Użycie "lub" odpada bo działa, ale są wyniki z kosmosu nie dokładne.
Pozdrawiam.
Rysh
Próbowałeś łapać and i or w nawiasy ?
www.aukcje.fm
No jeszcze nie.
Już sprawdzam.

W nawiasach również AND nie działa.
Select `id` from `table` where (1=1) and (`value` = 'a') and (`value` = 'b') - również nic nie podaje bo Value nie może być A i B zarazem.
Pyton_000
`value` in ('a','b')
Jaq
A nie może być jednocześnie B, musisz zapytać o A or B or AB or ABC
www.aukcje.fm
Cytat(Pyton_000 @ 22.04.2017, 20:46:46 ) *
`value` in ('a','b')


Testowałem dziś wcześniej ale daje tylko gdzie jest 'b' ale logicznie myślać powinno dawać gdzie jest 'a' i 'b' to fakt.
jakiś błąd logiczny twórców systemu.

Cytat(Jaq @ 22.04.2017, 20:48:56 ) *
A nie może być jednocześnie B, musisz zapytać o A or B or AB or ABC


Jak daję A or B to już jest maskara.
To Atrybuty ala allegro, chciał byś mieć po zaznaczeniu torebki i koloru czerownego wszetko w serwisie co jest torebką i ma kolor czerwowny biggrin.gif
nospor
Cytat
jakiś błąd logiczny twórców systemu.
Juz ci to raz prywanie pisalem ale widze nie rozumiesz. Napisze to jeszcze raz publicznie bo wprowadzasz zamet i tylko motasz ludziom w glowach nie opisujac problemu:

To nie jest blad logiczny tworcow bazy. To jest fakt, ze ty nie ogarniasz prostych rzeczy w mysql. Podalem ci rozwiazanie wczoraj na pw jak to sie rozwiazuje. Nie rozumiesz tego. Ok, kazdemu sie zdarza. Ale przestan jechac po jakim tam tworcach, bo oni akurat strukture zrobili poprawnie.
www.aukcje.fm
Cytat(nospor @ 22.04.2017, 21:04:44 ) *
Juz ci to raz prywanie pisalem ale widze nie rozumiesz. Napisze to jeszcze raz publicznie bo wprowadzasz zamet i tylko motasz ludziom w glowach nie opisujac problemu:

To nie jest blad logiczny tworcow bazy. To jest fakt, ze ty nie ogarniasz prostych rzeczy w mysql. Podalem ci rozwiazanie wczoraj na pw jak to sie rozwiazuje. Nie rozumiesz tego. Ok, kazdemu sie zdarza. Ale przestan jechac po jakim tam tworcach, bo oni akurat strukture zrobili poprawnie.


Odniosłem się do rozwiązania logicznego Pyton_000 gdyż jako że od wielu lat coś tam działam w mysql i php to jego rozwiazanie mi również wydało się absolutnie logiczne, tym bardziej że zapytanie typu Select `id` from `table` where `id` in (1,2,3) wydaje się być absolutnie logiczne więc nasze zapytanie Select `id` from `table` where `value` in ('c','b','c') również wydaje się logiczne. No proszę bądźmy pro. biggrin.gif

Analogicznie, stwierdzam, iż nie działa rozwiązanie nr2. które jest analogicznie logiczne i zawiera takie same przesłanki jedynie co do pól nie INT ale w tym przypadku do Varchar więc powinno działać na całych ciągach tak samo a nie działa, gdyż In to znak równości.
nospor
id in ('a', 'b')
to nic innego jak
id = 'a' OR id = 'b'

Bawiac sie od wielu lat w mysql powinienies takies podstawy ogarniasz.
I zdaje sie juz wczoraj wyjasnilismy sobie, ze to nie jest rozwiazanie twojego problemu a ty dalej uparcie w to idziesz. No powodzenia smile.gif Chcesz isc na polodnie, ale ze droga na polnoc jest ladniejsza to pchasz sie na polnoc ale ciagle jeczysz ze idziesz nie tam gdzie trzeba. Ot logika tongue.gif
www.aukcje.fm
To logiczna operacja na zbiorach gdzie coś się zawiera w całym zbiorze lub nie, tak więc jeżeli się ciągiem logicznym w sytuacji zawarcia w zborze wskazanych liczb zawiera dana liczba a suma kontrolna lub cały ciąg znaków już nie zawiera dla analogicznego zapytania to z całym szacunkiem ale to uznaję jako błąd twórców MySQL.

OR tutaj zmienia sytuację, choć zbiór logiczny typu IN powinien wskazywać na zawarcie logiczne występowania w zbiorze tylko i wyłącznie w zbiorze a nie poza zbiorem i to ŁACZNE, ale dalej jest to błędne działanie MySQL gdyż podaje tylko zawsze to co występuje w ostatniej pozycji więc typuje nam zbiór ID gdzie występuje B a nie A dla zapytania IN ('A','B')

Spoko to łamigłówka przedszkola tygodnia o ile nie miesiąca. Kilka głów już nad tym myślało smile.gif

To tylko dwie kolumny i 9 linii.

ID|VALUE
1|a
1|b
1|c
2|a
2|b
3|a
3|b
3|c
4|z

I teraz select takie ID gdzie Value = a, b, c (jednocześnie)

Po grupowaniu po ID odpowiedź pytona działa ale to jednak jak powiedział Nospr jest OR więc lipa.


IN TO ZAWARCIE W GRUPIE, czyli jako OR jak powiedział Nospr. To prawda i o ile występuje to na zbiorze liczb które nie mają ze sobą relacji i jest ok, to na zbiorze relatywnym od id to już nie działa i jest zwykłym OR.

Zbiór relatywny to już w tym przypadku będzie cięzko w jednym zapytaniu MySQL.

Select `id` from `table` where `value` IN ('a','b') jest jakimś pierwszym członem i teraz by trzeba więc jakoś to posortować gdyż `ID` powinny się powtarzać po 2 dla tych które są w 'a' i 'b' tak aby podać najpierw te id które są po dwa razy.
Pyton_000
SELECT `ID` FROM `table` WHERE `value` IN('a', 'b', 'c') GROUP BY `ID` HAVING COUNT(`ID`) >= 3;

Analogicznie jeśli będzie tylko 'a' i 'b' to count >= 2
nospor
Cytat
Spoko to łamigłówka przedszkola tygodnia o ile nie miesiąca. Kilka głów już nad tym myślało
Jedno poprawne rozwiazanie ja ci juz podalem wczoraj z JOINami. Ono dziala bo je stosuje od dawna. Tobie nie dziala, bo nie kojarzysz skladni SELECT i nie rozumiesz tego co ci podalem.

Kolejne poprawne rozwiazanie to te, ktore wlasnie specyzowal pyton z group by oraz having. Dla ciebie jest ono na tyle lepsze, ze je powinienies zrozumiec wink.gif

edit:
rozwiazanie podane przez pytona ma jedno maluska prawie nieistotna wade:
gdy w bazie bedzie sie znajdowal dwa razy rekord o ID =1 i wartosci 'a', wowczas to zapytanie zwroci bledny wynik. Pod tym wzgledem wersja z JOINami jest bezpieczniejsza. Ale taka sytuacja powinna byc zabezpieczona na etapie wprowadzania danych.
www.aukcje.fm
SELECT `ID` FROM `table` WHERE `value` IN('a', 'b', 'c') GROUP BY `ID` HAVING COUNT(`ID`) >= 3;

To działa super jak dla mnie typuje nam id, ale gdy jest docelowo :

Select * from Table_dane where (1 = 1) and `id` in (SELECT `ID` FROM `table` WHERE `value` IN('a', 'b', 'c') GROUP BY `ID` HAVING COUNT(`ID`) >= 3)

to zawiesza się proces i trzeba restartować mysql-a
Pyton_000
a to?
Kod
SELECT * FROM `Table_dane` t1
    JOIN (SELECT `ID` FROM `table` WHERE `value` IN('a', 'b', 'c') GROUP BY `ID` HAVING COUNT(`ID`) >= 3) as t2 ON (t1.id = t2.ID)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.