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%)
-----


Dane wejściowe:

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



Zakres danych:

  1.  
  2. CREATE TABLE produkty_wymagane
  3. (
  4. id_produktu int,
  5. wymagana_ilosc int
  6. )
  7.  
  8.  
  9. INSERT INTO produkty_wymagane
  10. SELECT 1, 98
  11. UNION
  12. SELECT 2, 45
  13.  



Wynik:

  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. JOIN produkty_wymagane pw ON pw.id_produktu=sp.idProduktu -- produkty wymagane
  9. WHERE
  10. sp.ilosc BETWEEN pw.wymagana_ilosc - 10 AND pw.wymagana_ilosc + 10 -- wymagana ilość z zakresem +/- 10g
  11. AND sp.idPotrawy NOT IN(
  12. SELECT DISTINCT idPotrawy
  13. FROM skladnikiPotraw
  14. WHERE
  15. idPotrawy=sp.idPotrawy
  16. AND idProduktu NOT IN(SELECT id_produktu FROM produkty_wymagane)) -- ograniczenie na produkty spoza wymaganych idProduktu
  17. GROUP BY sp.idPotrawy
  18. HAVING count(*) = (SELECT count(*) FROM produkty_wymagane) ------ warunek na ilość podanych produktów
  19. ) AS skladProd
  20. ON skladProd.idPotrawy=potr.idPotrawy
  21. JOIN produkty prod ON prod.idProduktu=sklad.idProduktu
  22.  
  23.  
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: 8.10.2025 - 19:20