![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 13.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam problem z zapytaniem w MySql, problem wyglada tak:
Muszę wyszukać w jednej kolumnie różne wartosci np: ...WHERE `kolumna_1` = 10 AND `kolumna_1` = 20 AND `kolumna_1` = 30 AND kolumna_1 to (INT) 'prawie' idealnie nadaje się IN (10,20,30), z tym ze potrzebuje wyniku gdzie dla kolumny_1 WHERE wlasnie jest takie jak wyzej zrobilem to zapytanie z LEFT JOIN, z tym ze łączyłem JOIN'em caly czas ta samą tabelę dla kolejnego AND..., to jest raczej mało wydajne (zakladajac że zapytanie może dojść do 30/40 AND na tej samej kolumnie) Proszę o pomoc, niestety nie mam żadnego pomysłu na to .... Pozdrawiam Kamil. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
ależ AND i IN są czymś zupełnie różne...
AND - sprawia ze wyszukujesz rekordy które spełniają wszystkie warunki czyli kolumna_1 musi mieć jednocześnie wartość 10, 20, 30 i ile byś jeszcze tam nie wstawił.... chyba średnio realne. przemyśl sprawe, bo wydaje mi sie ze w zlym miejscu chcesz cos na sile 'naprawiac' jesli nie - to poczytaj o uniach, tym mozesz zastąpić IN w sposob podobny do takiego jak chcesz uzyskac.... j. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 13.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
dokladnie wiem jak dziala in i and, i tez dobrze wiem ze and'em tego nie zrobie niestety tego przypadku nie da sie inaczej ogarnac, poniewaz to jest jedyna opcja na wpisanie w baze tak roznych danych powiazanych jedynie kluczami...
pytanie brzmi, jak badz czy istnieje jakas funkcja w mysql ktora mi w tym pomoze..., przypadek jest troche beznadziejny ale wierze ze jestescie w stanie mi pomoc (IMG:style_emoticons/default/wink.gif) pozdrawiam Kamil |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Wcale nie jest to beznadziejne. Jest wręcz banalne
Zapewne da się rozwiązać stosując operatory AND oraz OR i nawiasy. Zadałeś jednak pytanie tak, że nic z tego nie rozumiem. Opisz to lepiej |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 13.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
To jest przykład zapytania (które oczywiscie nie zadziała...). Więc jeszcze raz: Potrzebuje pobrać artykuły dla których opcje z 3 kolumn ('opcje_1','opcje_2','opcje_3') nie maja tylko jednej wartosci, dla kazdej kolumny wystepuje 'n' opcji (opcje te nie sa stale i tez dla tego `opcje_X` zostaly stworzone by magazynowac tam duza ilosc danych dla artykulu -> 1 artykul wiele opcji) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Tak na początek:
Razi całkowicie nieprawidłowa budowa bazy. Powinieneś mieć trzy tabele 1 Artykuły (id_artykuły, nazwa itd) 2 Opcje (id_opcje, nazwa itd) 3 artykuły_opcje (id_artykuly_opcje, id_opcje, id_artykuły, nazwa itd) W Twoim przypadku dodanie opcji skutkuje koniecznością przebudowy zapytań i dodania kolumny w bazie. Nadal nie jestem pewien czy cię rozumiem. Co to znaczy: opcje z 3 kolumn ('opcje_1','opcje_2','opcje_3') nie maja tylko jednej wartosci A co powiesz na takie coś:
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 13.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
kolumny wygladaja tak
id_atrybutu, id_wartosci, wartosc_specjalna 10, 100, 1000 20, 200, 2000 30, 300, 3000 40, 400, 400 przykladowe wartości i teraz senk w tym ze zawsze beda tworzone nowe atrybuty z nowymi wartosciami a w tym wyzej trzymam jedyne konfiguracje, fajnie by bylo miec dla kazdego atrybutu kolumne ale to wiarze sie z tym ze za kazdym razem gdy towrze/usuwam atrybut zmieniam baze, to co jest wyzej jest idealnym polaczeniem samych atrybutow z artykulem (w jednej tabeli trzymam wszystkie atrybuty, w drugiej wszystkie wartosci a w trzeciej polaczenie dla artykulu atrybut->wartosc->wartosc_specjalna (czyli id do polaczenia z poprzednimi tabelami) ) zapytanie ma wyciagac konfiguracje gdzie dla artykulu jest wybrany 'ten' 'ten' i 'ten' atrybut z 'takimi' 'takimi' 'takimi' wartosciami czyli 3 atrybuty z konkretnymi wartosciami np 10, 100, 1000 20, 200, 2000 30, 300, 3000 wszystkie trzy musza byc przypisane do artykulu i tu jest problem bo sam wiesz AND id_attr=30 ANd id_attr=33 nie ma prawa buty... wydaje mi sie ze nie ma mozliwosci zrobic tego zapytania w mysql musze wybrac w miare sensownie dane z bazy i przemielic je w php z tym ze tych wynikow moze byc nawet 600*30 ... |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
To co podajesz w przykladzie to blad logiczny.
AP.`opcje_1`=1 AND AP.`opcje_1`=2 AND zalozmy ze jestesmy w realnym swiecie i ze opcje_1 = "TO JESTES TY" a teraz 1 i 2 po znaku rownosci to: 1= Warszawa 2=Gdansk;) Teraz Ty chcesz w jednym czasie byc w Warszawie i Gdansku .. a to jest niemozliwe... Wiec moze opiszesz to bardziej precyzyjnie |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 13.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
nie uczcie mnie podstaw..., pytanie bylo proste i dosyc jasno opisane, chodzi o to czy jestem w stanie zrobic to w jedym zapytaniu czy dla kazdych kolejnych wybranych atrybutow musze znowu tworzy zapytanie z zawerzonym kregiem artyulow z poprzedniego zapytania ?
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Pytanie było niejasne, a tłumaczenie w stylu "zmienna = A AND zmienna = B" w ogóle nie pomaga. W dalszym ciągu nie wiem czy dobrze rozumiem Twój problem, ale może takie coś?
Najlepiej wklej strukturę tabel, oraz jakiego wyniku oczekujesz od zapytania. Ten post edytował redeemer 11.09.2012, 10:22:43 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 13.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
nie akutalne juz
aby bylo jasne nie moze wystapic zadne OR jezeli ktos ma ochote mozemy porozmawiaco tym na PM rozwiazalem problem po przez 'powielanie' kazdego zapytania z atrybutami, wyszukiwarka dziala w ajax'ie, kazdy atrybut jest zarzadzalny i niestety troche tych zapytan sie tworzy wiec w tym momencie musi to zostac Dzieki za pomoc pozdrawiam Kamil ps. jezeli ktos ma chceci tak jak pisalem PM |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
nie uczcie mnie podstaw..., pytanie bylo proste i dosyc jasno opisane, chodzi o to czy jestem w stanie zrobic to w jedym zapytaniu czy dla kazdych kolejnych wybranych atrybutow musze znowu tworzy zapytanie z zawerzonym kregiem artyulow z poprzedniego zapytania ? Skoro piszesz takie cos ...WHERE `kolumna_1` = 10 AND `kolumna_1` = 20 AND `kolumna_1` = 30 AND To jednak podstawy sa wymagane... |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 340 Pomógł: 49 Dołączył: 3.07.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Gdy wielu forumowiczów pisze o niejasnym opisie problemu, o tym, że to da się rozwiązać jednym zapytaniem, o niezrozumieniu podstaw algebry relacji....
autor wątku powinien to przemyśleć. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
dobra po długiej analizie chyba wiem o co chodzi
wyjaśnienie: są dwie tabele w relacji 1:n mają zostać wyświetlone tylko te wyniki z pierwszej tabeli dla których istnieje więcej niż jedna wartość w tabeli drugiej rozwiązanie - pisane z palca
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 744 Pomógł: 118 Dołączył: 14.02.2009 Skąd: poziome Ostrzeżenie: (0%) ![]() ![]() |
@Sazian, jesli jest faktycznie tak jak piszesz... to mozna to bez LEFT JOINA, poniewaz jak zrobisz JOINEM to i tak musi byc zlaczenie, a pozniej HAVING>1 czyli tak czy siak powinno byc zlaczenie.
W teorii powinno to szybciej smigac
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 28.09.2025 - 10:25 |