Mirki zastanawiam się jak rozwiązać taki problem, chodzi o wyszukiwanie w bazie danych. Mam dwie tabele o danej strukturze: Offers: id, name; OffersParameters: id, offer (foreign), parameterid, value; Jak wyszukać oferty w których parametr (parameterid) np. 10 = Warszawa i 300 = Zamojskiego. Mam zaćmienie jak to zrobić w SQL. Poradziłem sobie w inny sposób, ale mam niesmak, że nie jest to zrealizowane w SQL, a najlepiej bezpośrednio używając ORM Django. #programowanie #sql #django #postgresql
@kaab10 no to mi da liste parametrow o id 10 i moge przyrownac rozniez value do wyszukiwanego tekstu, wiem, ze moge potem wyciągnąć offer, tylko co gdy chce jeszcze jeden parametr dodac do wyszukania?
SELECT * FROM offersoffer AS oo LEFT JOIN offersofferparameters op ON oo.id = op.offerid AND op.parameterid = 46 LEFT JOIN offersofferparameters op2 ON oo.id = op2.offerid AND op2.parameter_id = 300 WHERE op.value = 'WARSZAWA' AND op2.value = 'Puławska'
@lu43n: a czemu ma nie być ? takie cośrobi sięw zapytaniu i tyle, przecież w orm też powinna być taka opcja gdzie możesz ustawić sobie relacje i w jakimś query builderze cisnąć
SELECT "offers_offer"."id", "offers_offer"."signature", "offers_offer"."slug", "offers_offer"."description" FROM "offers_offer" INNER JOIN "offers_offerparameters" ON ("offers_offer"."id" = "offers_offerparameters"."offer_id") INNER JOIN "offers_offerparameters" T4 ON ("offers_offer"."id" = T4."offer_id") WHERE ("offers_offerparameters"."value" = WARSZAWA AND "offers_offerparameters"."parameter_id" = 46 AND T4."value" = Biskupia AND T4."parameter_id" = 300) Dzięki za pomoc :)
Edit:
Tylko jak korzystasz z python manage.py shell, jak nie wiesz co to to poczytaj w dokumentacji
SELECT * FROM offersoffer AS oo LEFT JOIN offersofferparameters op ON oo.id = op.offerid AND op.parameterid = 46 LEFT JOIN offersofferparameters op2 ON oo.id = op2.offerid AND op2.parameter_id = 300 WHERE op.value = 'WARSZAWA' AND op2.value = 'Puławska'
op.valuea czymop.parameter_idi dlaczego raz jest miastem a innym razem ulicą? Kolumn się boisz?Czyli dla tabeli offerparameters (offer, parameterid, value): (1, 46, Warszawa), (2, 46, Poznań)... itp.. pierwsza id to oferta
WHERE oo.id IN(SELECT offer_id .... WHERE value IN(...) GROUP BY offer_id)Offer.objects.filter(offerparameters__parameter_id=46, offerparameters__value='WARSZAWA').filter(offerparameters__parameter_id=300, offerparameters__value='Biskupia')Generuje SQL:
SELECT "offers_offer"."id", "offers_offer"."signature", "offers_offer"."slug", "offers_offer"."description" FROM "offers_offer" INNER JOIN "offers_offerparameters" ON ("offers_offer"."id" = "offers_offerparameters"."offer_id") INNER JOIN "offers_offerparameters" T4 ON ("offers_offer"."id" = T4."offer_id") WHERE ("offers_offerparameters"."value" = WARSZAWA AND "offers_offerparameters"."parameter_id" = 46 AND T4."value" = Biskupia AND T4."parameter_id" = 300)Dzięki za pomoc :)