Wpis z mikrobloga

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
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

via Android
  • 0
@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?
  • Odpowiedz
Ok, mam coś takiego, ale czy to jest poprawne?

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'
  • Odpowiedz
@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ąć
  • Odpowiedz
@MQs: Mam dynamiczną listę parametrów dla każdej oferty, dlatego jest w osobnej tabeli.

Czyli dla tabeli offerparameters (offer, parameterid, value): (1, 46, Warszawa), (2, 46, Poznań)... itp.. pierwsza id to oferta
  • Odpowiedz
@MQs: @Jurigag: @kaab10: Ok, rozkminiłem nie wiedziałem, że można tak używać metod w django queryset. Rozwiązanie:

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 :)
  • Odpowiedz