Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Dynamiczne szukanie. Niby proste ale.., MYSQL
www.aukcje.fm
post
Post #1





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


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.

Ten post edytował www.aukcje.fm 22.04.2017, 20:16:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
Rysh
post
Post #2





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

Ostrzeżenie: (0%)
-----


Próbowałeś łapać and i or w nawiasy ?
Go to the top of the page
+Quote Post
www.aukcje.fm
post
Post #3





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


`value` in ('a','b')
Go to the top of the page
+Quote Post
Jaq
post
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 17.11.2006

Ostrzeżenie: (0%)
-----


A nie może być jednocześnie B, musisz zapytać o A or B or AB or ABC
Go to the top of the page
+Quote Post
www.aukcje.fm
post
Post #6





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


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 (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.
Go to the top of the page
+Quote Post
www.aukcje.fm
post
Post #8





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


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. (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
www.aukcje.fm
post
Post #10





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


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 (IMG:style_emoticons/default/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.

Ten post edytował www.aukcje.fm 22.04.2017, 21:43:08
Go to the top of the page
+Quote Post
Pyton_000
post
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował Pyton_000 22.04.2017, 22:05:07
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
www.aukcje.fm
post
Post #13





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


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

Ten post edytował www.aukcje.fm 23.04.2017, 12:39:09
Go to the top of the page
+Quote Post
Pyton_000
post
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 02:19