【问题标题】:Select subscriptions based on user id根据用户 ID 选择订阅
【发布时间】:2021-06-26 16:40:30
【问题描述】:

我有这些 MySQL 表,我想在其中存储用户订阅:

CREATE TABLE subscription (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `amount` decimal(19,2) DEFAULT NULL,
  `created_at` datetime(6) DEFAULT NULL,
  `currency` varchar(20) DEFAULT NULL,
  `duration` bigint(20) DEFAULT NULL,
  `end_at` datetime(6) DEFAULT NULL,
  `error` varchar(200) DEFAULT NULL,
  `order_id` int(11) DEFAULT NULL,
  `product` varchar(20) DEFAULT NULL,
  `run_at` datetime(6) DEFAULT NULL,
  `start_at` datetime(6) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL,
  `updated_at` datetime(6) DEFAULT NULL,
  `title` varchar(20) DEFAULT NULL,
  `parent_transaction_id` int(11) DEFAULT NULL,
  `parent_transactionId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23443556 DEFAULT CHARSET=latin1;


INSERT INTO subscription (`id`, `amount`, `created_at`, `currency`, `duration`, `end_at`, `error`, `order_id`, `product`, `run_at`, `start_at`, `status`, `updated_at`, `title`, `parent_transaction_id`, `parent_transactionId`) VALUES 
('122', '3333.00', '2020-10-31 19:41:16.622386', 'USD', '1000', '2020-10-31 19:41:16.622386', 'error message', '122', 'error message', '2020-10-31 19:41:16.622386', '2020-10-31 19:41:16.622386', 'active', '2020-10-31 19:41:16.622386', 'title', '443', '5544');

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) DEFAULT NULL,
  `enabled` tinyint(4) DEFAULT NULL,
  `encrypted_password` varchar(255) DEFAULT NULL,
  `first_name` varchar(255) DEFAULT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `role` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=153 DEFAULT CHARSET=latin1;

INSERT INTO `users` (`id`, `email`, `enabled`, `encrypted_password`, `first_name`, `last_name`, `role`) VALUES 
('192', 'test@mail.com', '1', '$2a$31$ovShEKleI3Yk2vgjAIF5mO4HkGWXcTSKPMTaj7rFN4KAtlEz0f/ay', 'test', 'test', 'ROLE_CLIENT');

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city` varchar(30) DEFAULT NULL,
  `CONTENT` text DEFAULT NULL,
  `country` varchar(50) DEFAULT NULL,
  `created_at` datetime(6) DEFAULT NULL,
  `discount` decimal(8,2) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `grand_total` decimal(8,2) DEFAULT NULL,
  `item_discount` decimal(8,2) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `line1` varchar(50) DEFAULT NULL,
  `line2` varchar(50) DEFAULT NULL,
  `middle_name` varchar(50) DEFAULT NULL,
  `mobile` varchar(15) DEFAULT NULL,
  `promo` varchar(100) DEFAULT NULL,
  `province` varchar(50) DEFAULT NULL,
  `session_id` int(11) DEFAULT NULL,
  `shipping` decimal(8,2) DEFAULT NULL,
  `status` varchar(100) DEFAULT NULL,
  `sub_total` decimal(8,2) DEFAULT NULL,
  `tax` decimal(8,2) DEFAULT NULL,
  `token` varchar(100) DEFAULT NULL,
  `total` decimal(8,2) DEFAULT NULL,
  `updated_at` datetime(6) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `phone` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=latin1;

INSERT INTO `orders` (`id`, `city`, `CONTENT`, `country`, `created_at`, `email`, `first_name`, `grand_total`, `item_discount`, `last_name`, `status`, `sub_total`, `tax`, `total`, `user_id`) VALUES 
('122', 'city', 'test context', 'USA', '2021-05-25 12:40:23.793779', 'test@email.com', 'first name', '100', '10', 'last name', 'active', '20', '10', '200', '192');
INSERT INTO `orders` (`id`, `city`, `CONTENT`, `country`, `created_at`, `email`, `first_name`, `grand_total`, `item_discount`, `last_name`, `status`, `sub_total`, `tax`, `total`, `user_id`) VALUES 
('124', 'city', 'test context', 'USA', '2021-05-25 12:40:23.793779', 'test@email.com', 'first name', '100', '10', 'last name', 'active', '20', '10', '200', '192');


CREATE TABLE `order_item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `discount` decimal(19,2) DEFAULT NULL,
  `order_id` int(11) DEFAULT NULL,
  `price` decimal(19,2) DEFAULT NULL,
  `product_id` int(11) DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `sku` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

SQLFiddle:http://sqlfiddle.com/#!9/1d6ba6/1

我使用这个带有 2 个 JOINS 的 SQL 查询来获取订阅:

SELECT *
FROM subscription
INNER JOIN Orders ON subscription.order_id = Orders.id AND subscription.id = 122
INNER JOIN users ON users.id = users.id AND Orders.user_id = 192
ORDER BY subscription.id;   

如您所见,我使用 2 个参数来进行 2 个 JOINS。是否可以仅将用户 ID 作为参数发送并根据匹配 Orders.id AND subscription.id 来获取找到的订阅记录?

【问题讨论】:

  • 我不明白这个问题。你有一个或两个参数吗?你想要什么结果?如果你想要来自所有三个表的列——select * 暗示——那么你需要查询中的所有三个表。
  • 因此我需要根据用户 ID 为用户订阅
  • @PeterPensov 。 . .我只是建议你问一个新问题,清楚地描述你想要做什么、样本数据和期望的结果。这个问题已经回答了,所以编辑它是不公平的。

标签: mysql sql mariadb


【解决方案1】:

您的查询没有意义,使用链接订单和用户的 ON 子句

所以你可以在没有用户的情况下达到相同的结果

SELECT *
FROM subscription
INNER JOIN Orders ON subscription.order_id = Orders.id AND subscription.id = 122
INNER JOIN users ON users.id = Orders.user_id
ORDER BY subscription.id;

顺便说一句,别名的用户可以帮助保持更多的概览

SELECT *
FROM subscription s
INNER JOIN Orders o  ON s.order_id = o.id AND s.id = 122
INNER JOIN users u ON u.id = o.user_id
ORDER BY s.id;      

【讨论】:

  • 还有一个问题。如何将日期范围发送到查询?我想获取最近的订阅查询?
  • 按 s.created_at DESC 和 LIMIT 1 订购
  • 如何指定日期范围?
  • 我收到You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND LIMIT 1' at line 5
  • 我不确定你在做什么,看看这是否有助于制作新的小提琴sqlfiddle.com/#!9/1d6ba6/29
猜你喜欢
  • 2021-09-09
  • 2019-12-28
  • 2012-08-05
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2017-11-22
  • 2017-10-10
  • 2014-10-14
相关资源
最近更新 更多