Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Złożone zapytanie SQL
markuz
post
Post #1





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


Witam,

Mam problem z dosyć złożonym zapytaniem SQL. Posiadam 3 tabele:

  1. CREATE TABLE `lg_campaigns` (
  2. `id` INT NOT NULL AUTO_INCREMENT,
  3. `user_id` INT NOT NULL,
  4. `created_at` DATETIME NOT NULL,
  5. `status` TINYINT(1) DEFAULT 0,
  6. `name` VARCHAR(100) NOT NULL,
  7. `campaign_type` TINYINT(1) NOT NULL,
  8. `content_type` TINYINT(1) NOT NULL,
  9. `url` VARCHAR(300) DEFAULT NULL,
  10. `html` TEXT DEFAULT NULL,
  11. PRIMARY KEY(`id`)
  12. );
  13.  
  14. CREATE TABLE `lg_campaigns_geo_targets` (
  15. `id` INT NOT NULL AUTO_INCREMENT,
  16. `campaign_id` INT NOT NULL,
  17. `country_id` INT NOT NULL,
  18. `unique` TINYINT(1) NOT NULL,
  19. `min_bid` FLOAT NOT NULL,
  20. `max_bid` FLOAT NOT NULL,
  21. `budget` FLOAT NOT NULL,
  22. `daily_budget` FLOAT NOT NULL DEFAULT 0,
  23. PRIMARY KEY(`id`)
  24. );
  25.  
  26. CREATE TABLE `lg_campaigns_views` (
  27. `campaigns_geo_target_id` INT NOT NULL,
  28. `bid` FLOAT NOT NULL,
  29. `ip` VARCHAR(20) NOT NULL,
  30. `created_at` DATETIME NOT NULL,
  31. FOREIGN KEY (`campaigns_geo_target_id`) REFERENCES `lg_campaigns_geo_targets` (`id`)
  32. );


Gdzie:
lg_campaigns - Kampanie reklamowe
lg_campaigns_geo_targets - Dostępne kraje dla danej kampanii reklamowej
lg_campaigns_views - Odsłony dla danego kraju z danej kampanii reklamowej

Chcę pobrać:
Kampanię reklamową (lg_campaigns) (Tylko 1 - LIMIT 1)
Gdzie:
lg_campaigns.status = 1 (Aktywna kampania)
lg_campaigns_geo_targets.country_id = X (Kraj użytkownika który wyświetla reklame)
Jeżeli lg_campaigns_geo_targets.daily_budget > 0 (Kampania posiada dziennie ograniczenie budżetu do wydania)
- Pobierana jest suma wydanych dzisiaj środków (lg_campaigns_views.bid) dla danego kraju kampanii (lg_campaigns_geo_targets)
Jeżeli ruch dla danego kraju kampanii jest unikalny (lg_campaigns_geo_targets.unique = 1) wtedy:
- Pobierana jest suma dzisiejszych wyświetleń (lg_campaigns_views) dla danego IP (lg_campaigns_views.ip) (Suma musi być = 0 - tzn. dzisiaj żaden użytkownik z tym IP nie wyświetlił tej reklamy).
- Sortowanie malejąco według lg_campaigns_geo_targets.max_bid (Czyli ta kampania która ma największą ofertę zostaje pobrana)

Problem tkwi głównie w tym:
  1. AND lg_campaigns_geo_targets.daily_budget <
  2. IF(lg_campaigns_geo_targets.daily_budget > 0,
  3. (SELECT SUM(lg_campaigns_views.bid) WHERE lg_campaigns_geo_targets.id = lg_campaigns_views.campaigns_geo_target_id FROM lg_campaigns_views),
  4. 1
  5. )


Nie wiem jak połączyć pobieranie sumy wydanych środków skoro nie wiem jeszcze jaką kampanie skrypt wybierze..


Ma ktoś pomysł jak to zrobić 1 zapytaniem? (IMG:style_emoticons/default/smile.gif)

Takie zapytanie też nie chce działać:
  1. SELECT lg_campaigns.*, (SELECT SUM(lg_campaigns_views.bid) FROM lg_campaigns_views WHERE lg_campaigns_geo_targets.id = lg_campaigns_views.campaigns_geo_target_id) AS `today_spend_budget`
  2. FROM lg_campaigns
  3. JOIN lg_campaigns_geo_targets ON lg_campaigns.id = lg_campaigns_geo_targets.campaign_id
  4. LEFT JOIN lg_campaigns_views ON lg_campaigns_geo_targets.id = lg_campaigns_views.campaigns_geo_target_id
  5. WHERE lg_campaigns.STATUS = 1
  6. AND lg_campaigns_geo_targets.country_id = 1
  7. AND IF(lg_campaigns_geo_targets.daily_budget > 0, `today_spend_budget` < lg_campaigns_geo_targets.daily_budget , TRUE)
  8. LIMIT 1

Błąd: Unknown column 'today_spend_budget' in 'where clause'
Czemu tak jest skoro zaznaczyłem `today_spend_budget` jako sumę wszystkich ofert (bid) (Pomijając już datę).

PS. nie mogłem modyfikować posta ze względu na jakiś błąd z takiem SQL. (Podmieniło czysty tekst na HTML przy kolorowaniu składni).

Ten post edytował markuz 25.03.2014, 09:49:25
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: 2.10.2025 - 20:15