Получить правильные данные для конкретного идентификатора - PullRequest
0 голосов
/ 31 мая 2018

Я хочу получить цены на каждый товар для конкретного места.Вот что я сделал до сих пор.

SELECT pl.id AS place_id,
pl.data_name AS place_name,
pp.data_price AS product_price,
pp.date_updated AS price_updated

FROM places AS pl
JOIN products AS pr
ON pl.id = pr.id_place
JOIN products_prices AS pp
WHERE pp.id_product = '30'
GROUP BY pl.id, pp.data_price, pp.date_updated
ORDER BY pp.data_price DESC, pp.date_updated DESC

enter image description here

Как вы можете видеть на изображении выше, product_price и price_updated всетот же самый.place_name также показывает 3 места, где нет продукта с идентификатором 30.

Вот как это должно выглядеть (самая дешевая, самая последняя покупка продукта сверху):

place_id    place_name        product_price    price_updated
       3    ICA Maxi                   4.95    2018-05-16
       1    ICA Supermarket            5.90    2018-05-27
      26    ICA Skutan                 6.50    2018-05-29

ВотСтруктура базы данных:

CREATE TABLE IF NOT EXISTS `places` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data_name` tinytext NOT NULL,
  `data_address` text,
  `data_address_city` tinytext NOT NULL,
  `data_coordinates` varchar(50) NOT NULL,
  UNIQUE KEY `id` (`id`)
);

INSERT INTO `places` (`id`, `data_name`, `data_address`, `data_address_city`, `data_coordinates`) VALUES
    (1, 'ICA Supermarket', 'Björkhagsgatan 9', 'Skoghall', '59.324971,13.467291'),
    (2, 'ICA Maxi', 'Bergviks Köpcentrum', 'Karlstad', '59.376563,13.428787'),
    (3, 'ICA Kvantum', 'Bivägen 11', 'Hammarö', '59.343388,13.504583'),
    (4, 'IKEA', 'Bergviksvägen 43', 'Karlstad', '59.379032,13.420646'),
    (5, 'Karlstad Naprapatklinik', 'Västra Torggatan 15', 'Karlstad', '59.381379,13.501683'),
    (9, 'Besök i Borgvik AB', '', 'Borgvik', '59.348261,12.954707'),
    (23, 'Mariebergsskogen', '', 'Karlstad', '59.369403,13.486485'),
    (24, 'Happy Price', 'Brehogsvägen 20', 'Tanumshede', '58.723730,11.344768'),
    (25, 'Trekanten Kök & Bar', 'Parkvägen 2', 'Hamburgsund', '58.552733,11.270998'),
    (26, 'ICA Skutan', 'Strandvägen', 'Hamburgsund', '58.552122,11.270898');



CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_place` int(11) NOT NULL,
  `data_barcode` text NOT NULL,
  `data_name` text NOT NULL,
  `data_weight` text NOT NULL,
  `data_weight_type` text NOT NULL,
  UNIQUE KEY `id` (`id`)
);

INSERT INTO `products` (`id`, `id_place`, `data_barcode`, `data_name`, `data_weight`, `data_weight_type`) VALUES
    (7, 3, '7311070008494', 'Pågen Lantbröd', '650', 'g'),
    (8, 3, '7310618084808', 'Grumme citronsåpa', '750', 'ml'),
    (9, 3, '7318690079835', 'ICA Basic toalettpapper', '', ''),
    (12, 1, '7318690134640', 'ICA Basic Milk & Caramel', '100', 'g'),
    (18, 3, '7310380512103', 'ICA Home dishmatic refillsvamp', '', ''),
    (19, 3, '7340109200684', 'Plastkasse', '', ''),
    (20, 1, '7310751163903', 'ICA tonfisk filébitar i vatten', '185', 'g'),
    (24, 1, '7310865001818', 'Arla mellanmjölk', '1.5', 'kg'),
    (25, 1, '7318690079712', 'ICA kattsand (klumpbildande, ej parfym)', '6', 'kg'),
    (29, 26, '3068320055008', 'Evian mineralvatten', '500', 'mL'),
    (30, 26, '7318690134640', 'ICA Basic Milk & Caramel', '100', 'g'),
    (33, 2, '0', 'ICA Basic Milk & Caramel', '100', 'g');



CREATE TABLE IF NOT EXISTS `products_prices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_product` int(11) NOT NULL,
  `id_transaction` int(11) NOT NULL,
  `data_price` decimal(10,2) NOT NULL,
  `data_amount` tinytext NOT NULL,
  `data_discount` tinytext,
  `data_discount_amount` tinytext,
  `data_discount_sum` tinytext,
  `data_pant` tinytext,
  `date_updated` date NOT NULL,
  UNIQUE KEY `id` (`id`)
);

INSERT INTO `products_prices` (`id`, `id_product`, `id_transaction`, `data_price`, `data_amount`, `data_discount`, `data_discount_amount`, `data_discount_sum`, `data_pant`, `date_updated`) VALUES
    (1, 1, 907, 18.90, '4', '', '2', '30', NULL, '2018-05-18'),
    (2, 12, 907, 4.90, '4', '', '', '', NULL, '2018-05-18'),
    (5, 4, 904, 18.90, '1', '', '', '', NULL, '2018-05-18'),
    (6, 14, 904, 14.90, '1', '', '', '', NULL, '2018-05-18'),
    (17, 19, 936, 2.00, '1', '', '', '', NULL, '2018-05-21'),
    (18, 21, 947, 23.90, '1', '', '', '', NULL, '2018-05-23'),
    (19, 22, 947, 10.50, '1', '', '', '', NULL, '2018-05-23'),
    (20, 20, 947, 15.90, '1', '', '', '', NULL, '2018-05-23'),
    (21, 13, 947, 49.90, '1', '', '', '', NULL, '2018-05-23'),
    (22, 23, 948, 14.90, '1', '', '', '', NULL, '2018-05-24'),
    (23, 24, 961, 14.90, '1', NULL, NULL, NULL, NULL, '2018-05-27'),
    (24, 12, 961, 5.90, '4', NULL, NULL, NULL, NULL, '2018-05-27'),
    (32, 28, 967, 8.50, '2', NULL, NULL, NULL, NULL, '2018-05-28'),
    (33, 29, 972, 12.90, '1', NULL, NULL, NULL, '1', '2018-05-29'),
    (34, 30, 973, 6.50, '2', NULL, NULL, NULL, NULL, '2018-05-29'),
    (35, 31, 976, 10.00, '1', NULL, NULL, NULL, NULL, '2018-05-30'),
    (36, 32, 976, 10.00, '1', NULL, NULL, NULL, NULL, '2018-05-30');

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Как уже упоминалось в моем комментарии к вашему запросу: вы забыли предложение ON, связывающее таблицу products_prices с двумя другими.

MariaDB противно преобразовывает ваше внутреннее соединение в перекрестное соединение вместо повышенияошибка как и должно быть.Это дает вам следующее: выберите все цены на продукт 30 в сочетании со всеми местами, умноженными на количество продуктов в нем, а не просто в сочетании с местом продукта.

Кстати: я бы поставил таблицу products сначала в предложении FROM, потому что это основа (вам нужен продукт 30).Затем присоединитесь к ценам продукта и месту его размещения.

Нет причин группировать ваши данные, так как вы хотите только перечислить цены.Вы ничего не агрегируете.Итак, вы получите:

SELECT 
  pl.id AS place_id,
  pl.data_name AS place_name,
  pp.data_price AS product_price,
  pp.date_updated AS price_updated
FROM products AS pr
JOIN products_prices AS pp ON pp.id_product = pr.id
JOIN places pl ON pl.id = pr.id_place
WHERE pr.id = 30
ORDER BY pp.data_price DESC, pp.date_updated DESC;
0 голосов
/ 31 мая 2018

Попробуйте это:

SELECT PL.id AS place_id,
PL.data_name AS place_name,
PP.data_price AS product_price,
PP.date_updated AS price_updated
FROM products_prices PP
JOIN products PR
    ON PR.id = PP.id_product
JOIN places PL
    ON PL.id = PR.id_place
WHERE PR.id = '30'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...