"Mały" problem z zapytaniem/podzapytaniem.

0

Mam dwie tabele

Tabela vgk0u_zlecenia_offer:

CREATE TABLE IF NOT EXISTS `vgk0u_zlecenia_offer` (
    `offer_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT(11) NOT NULL,
    `customer_id` INT(11) NOT NULL,
    `payment_method_id` INT(11) NOT NULL,
    `price` DECIMAL(10,2) NOT NULL,
    `comments` TEXT COLLATE utf8_unicode_ci DEFAULT NULL,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `published` TINYINT(4) DEFAULT 1,
    `checked_out` INT(11) NOT NULL,
    `checked_out_time` DATETIME NOT NULL,
    FOREIGN KEY (`user_id`) REFERENCES `vgk0u_users`(`id`),
    FOREIGN KEY (`payment_method_id`) REFERENCES `vgk0u_zlecenia_payment_method`(`payment_method_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Zawartośc tabeli vgk0u_zlecenia_offer:

offer_id user_id customer_id payment_method_id price comments create_time update_time published checked_out checked_out_time
1 860 45064 5 6496.42 UwagiDoOferty 2019-06-25 1353 2019-06-25 1353 1 0 0000-00-00 0000
2 860 45064 5 6496.42 UwagiDoOferty 2019-06-25 1353 2019-06-25 1353 1 0 0000-00-00 0000

Tabela vgk0u_zlecenia_order:

CREATE TABLE IF NOT EXISTS `vgk0u_zlecenia_order` (
	`order_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `offer_id` INT(11) NOT NULL,
    `i_index` INT(11) NOT NULL,
    `order_index` VARCHAR(16) NOT NULL,
    `added_to_crm` TINYINT(4) NOT NULL DEFAULT 0,
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (`offer_id`) REFERENCES `vgk0u_zlecenia_offer`(`offer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Zawartośc tabeli vgk0u_zlecenia_order:

order_id offer_id i_index order_index added_to_crm create_time update_time
1 1 0 INDEXZLECENIA 0 2019-06-25 1342 2019-06-25 1342

Treść mojego zapytania wygląda następująco:

SELECT 	`OF`.`offer_id`,
		`OF`.`customer_id`,
        `OF`.`price`,
        `OF`.`update_time`,
        COUNT((
				SELECT 	`order_id`
                FROM 	`vgk0u_zlecenia_order`
				WHERE 	`offer_id` = `OF`.`offer_id`
		)) AS `orders`
FROM 	`vgk0u_zlecenia_offer` AS `OF`,
		`vgk0u_zlecenia_order` AS `OR`
WHERE 	`OF`.`user_id` = 860;

Wynik powyższego zapytania:

offer_id customer_id price update_time orders
1 45064 6496.42 2019-06-25 1205 1

Mój problem polega na tym, iż chciałbym wyświetlić ile rekordów z tabeli vgk0u_zlecenia_order jest przypisanych do rekordów z tabeli vgk0u_zlecenia_offer. Złączenie następuje poprzez offer_id. Pierwszy rekord wyświetla mi się prawidłowo, gdyż funkcja COUNT zawraca 1 i ten rekord się wyświetla. Nie wyświetla mi się natomiast drugi rekord, w tym wypadku wartość zwracana przez COUNT powinna wynosić 0. Czyli chciałbym aby ilość zwracanych rekordów była taka sama jak ilość rekordów w tabeli vgk0u_zlecenia_offer. Jeżeli jest takich rekordów 0, to wtedy 0, jeżeli więcej niż 0 to konkretna liczba, ile takich rekordów występuję. Czy wie ktoś w jaki sposób powinienem przerobić moje zapytanie, aby uzyskać pożądany przeze mnie efekt? Mam nadzieje, że wszystko jest jasno opisane. Pozdrawiam.

1

LEFT JOIN

0
Marcin.Miga napisał(a):

LEFT JOIN

Chyba czegoś nie dostrzegam, skorzystałem z LEFT JOIN jak mi poradziłeś jednak w sumie to się nic nie zmieniło, ciągle zwraca mi jeden rekord.

SELECT `OF`.`offer_id`, `OF`.`customer_id`, `OF`.`price`, `OF`.`update_time`, COUNT(`OR`.`order_id`)
FROM `vgk0u_zlecenia_offer` AS `OF`
LEFT JOIN `vgk0u_zlecenia_order` AS `OR` ON `OF`.`offer_id` = `OR`.`offer_id`;
1
SELECT `OF`.`offer_id`, `OF`.`customer_id`, `OF`.`price`, `OF`.`update_time`, COUNT(`OR`.`order_id`)
FROM `vgk0u_zlecenia_offer` AS `OF`
LEFT JOIN `vgk0u_zlecenia_order` AS `OR` ON `OF`.`offer_id` = `OR`.`offer_id`
GROUP BY `OF`.`offer_id`, `OF`.`customer_id`, `OF`.`price`, `OF`.`update_time`

1 użytkowników online, w tym zalogowanych: 0, gości: 1