Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pomoc w skonstruowaniu zapytania
_chris_
post
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 19.08.2011

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


Witam wszystkich
Dzisiaj stanąłem przed wyzwaniem, którego nie mogę ni jak pokonać. Do dalszej rozbudowy pewnej aplikacji muszę dodać jedną funkcjonalność. Ogólnie jest tak, że program teraz dobiera ilości produktów żywieniowych wg jakiś tam kryteriów. Tak czy inaczej wypluwa mi idProduktu i ilosc. Baza przedstawia się mniej więcej tak (ująłem tylko istotne właściwości) :

produkty:
idProduktu | nazwa

potrawy:
idPotrway | opis

skladnikiPotraw:
idPotrawy | idProduktu | ilosc

Program wypluwa na przykład: produkty - ilości (id - gram) : 1 - 20, 2 - 30, 3 - 40

Jak teraz mógłbym pobrać wszystkie potrawy spełniające wymagania, że wymagają do przygotowania tylko wybranych produktów, wybrana ilość jest wystarczająca do przygotowania potrawy. Mało tego, potrzebuję jeszcze wybrać takich potraw 21 (3 dziennie x 7 dni).

Z góry dziękuję za jakiekolwiek sugestie, bo stoję w martwym punkcie, a czas goni.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
trafas
post
Post #2





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


Mi się wydaje że jest to bardziej złożony problem.

Z tego co zrozumiałem, to kolega chce podawać do zapytania produkty ( id produktów ) i w wyniku mają być zwrócone wszystkie potrawy, które zawierają tylko i wyłącznie podane produkty.

Zakładając takie dane wejściowe:

  1.  
  2. CREATE TABLE produkty
  3. (
  4. idProduktu int,
  5. nazwa varchar(255)
  6. );
  7.  
  8. CREATE TABLE potrawy
  9. (
  10. idPotrawy int,
  11. opis varchar(255)
  12. );
  13.  
  14. CREATE TABLE skladnikiPotraw
  15. (
  16. idPotrawy int,
  17. idProduktu int,
  18. ilosc int
  19. );
  20.  
  21. INSERT INTO produkty
  22. SELECT 1, 'prod 1'
  23. UNION
  24. SELECT 2, 'prod 2'
  25. UNION
  26. SELECT 3, 'prod 3'
  27. UNION
  28. SELECT 4, 'prod 4'
  29. UNION
  30. SELECT 5, 'prod 5'
  31. UNION
  32. SELECT 6, 'prod 6'
  33.  
  34.  
  35. INSERT INTO potrawy
  36. SELECT 1, 'potr 1'
  37. UNION
  38. SELECT 2, 'potr 2'
  39. UNION
  40. SELECT 3, 'potr 3'
  41. UNION
  42. SELECT 4, 'potr 4'
  43. UNION
  44. SELECT 5, 'potr 5'
  45. UNION
  46. SELECT 6, 'potr 6'
  47.  
  48.  
  49.  
  50. INSERT INTO skladnikiPotraw
  51. SELECT 1, 1, 12
  52. UNION
  53. SELECT 1, 2, 12
  54. UNION
  55. SELECT 1, 3, 12
  56. UNION
  57. SELECT 2, 1, 45
  58. UNION
  59. SELECT 2, 2, 10
  60. UNION
  61. SELECT 2, 3, 5
  62. UNION
  63. SELECT 2, 4, 18
  64. UNION
  65. SELECT 3, 5, 3
  66. UNION
  67. SELECT 3, 6, 7
  68. UNION
  69. SELECT 3, 1, 4
  70. UNION
  71. SELECT 6, 1, 5
  72. UNION
  73. SELECT 6, 2, 1
  74.  


i taki warunek na wymagane produkty ( Jako że bawię się w konsoli, to zrobiłem sobie tabelę z id wymaganych produktów. Docelowo id mogą być przekazywane jako tablica w parametrze funkcji):

  1.  
  2. CREATE TABLE produkty_wymagane
  3. (
  4. id_produktu int
  5. )
  6.  
  7. INSERT INTO produkty_wymagane
  8. SELECT 1
  9. UNION
  10. SELECT 2
  11.  


to wynikiem powinna być tylko i wyłącznie potrawa ID 6


Wykombinowałem sobie takie zapytanie:

  1.  
  2. SELECT *
  3. FROM potrawy potr
  4. JOIN skladnikiPotraw sklad ON sklad.idPotrawy=potr.idPotrawy
  5. JOIN (
  6. SELECT sp.idPotrawy, count(*) AS iloscProduktow
  7. FROM skladnikiPotraw sp
  8. WHERE
  9. sp.idProduktu IN(SELECT * FROM produkty_wymagane) -- ograniczenie na id produktów
  10. AND sp.idPotrawy NOT IN(
  11. SELECT idPotrawy
  12. FROM skladnikiPotraw
  13. WHERE
  14. idPotrawy=sp.idPotrawy
  15. AND idProduktu NOT IN(SELECT * FROM produkty_wymagane)) -- ograniczenie na ilość produktów w potrawach
  16. GROUP BY sp.idPotrawy
  17. HAVING count(*) >= (SELECT count(*) FROM produkty_wymagane)
  18. ) AS skladProd
  19. ON skladProd.idPotrawy=potr.idPotrawy
  20. JOIN produkty prod ON prod.idProduktu=sklad.idProduktu
  21.  



Czy o takie coś koledze chodziło (IMG:style_emoticons/default/questionmark.gif) ?


Jeżeli tak, to losowanie potraw 3 x 21 nie powinno już być problemem.
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 04:27