Как создать SQL-запрос, в котором я могу выбрать максимальное количество одного столбца с предложением WHERE & AND - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь создать запрос SQL. Я застрял, так как не могу получить желаемый результат. Я использую phpMyAdmin, чтобы попробовать эти запросы,

Что я пробовал:

Я пытался использовать предложения GROUP BY и WHERE, но не могу заставить его работать.

Запрос, который я пробовал:

SELECT products.product_name, 
    orderitem.quantity,
    products.product_price
FROM orderitem 
    INNER JOIN producten ON orderitem.FKproductID = products.productID
    INNER JOIN orders ON orderitem.FKproductID = orders.orderID
    INNER JOIN tables ON orders.FKtableID = tables.tableID
WHERE tables.tablelnr = '1'

и

SELECT products.product_name,
    orderitem.quantity,
    products.product_price,
    tables.tablenr,
    MAX(orders.ordernr)
FROM orderitem
    INNER JOIN products ON orderitem.FKproductID = producten.productID
    INNER JOIN orders ON orderitem.FKorderID = orders.orderID
    INNER JOIN tables ON orders.FKorderID = tables.tablelID
GROUP BY tables.tablenr

и

SELECT products.product_name,
    orderitem.quantity,
    products.product_price
FROM orderitem
    INNER JOIN producten ON orderitem.FKproductID = products.
    INNER JOIN orders ON orderitem.FKproductID = orders.
    INNER JOIN tables ON orders.FKtableID = tables.tableID
WHERE tables.tablelnr = '1'
AND orders.ordernr = MAX(order.ordernr)

Для пояснения это база данных и таблицы:

enter image description here Содержание таблиц:

Результат, который я пытался получить

Таким образом, результатом будет имя продукта, количество, цена и номер таблицы. ГДЕ табличное число равно Х И максимальный порядковый номер таблицы Х.

Допустим, есть 4 заказа с 4 номерами заказов. Три заказа принадлежат таблице 1, и один заказ принадлежит таблице 2. Тогда я хотел бы получить самый высокий номер заказа (3) и где номер таблицы = 1.

Так что, в основном, я хочу получить наибольшее число столбцов, а также где-то, что равно.

Если есть какие-либо вопросы относительно моего объяснения, пожалуйста, задавайте. Это довольно сложно объяснить.

Данные моей таблицы (экспорт SQL phpmyadmin):

-- phpMyAdmin SQL Dump
-- version 4.8.5
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Apr 25, 2019 at 08:04 PM
-- Server version: 10.1.38-MariaDB
-- PHP Version: 7.3.4

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `overflow`
--

-- --------------------------------------------------------

--
-- Table structure for table `orderitem`
--

CREATE TABLE `orderitem` (
  `orderItemID` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  `FKorderID` int(11) NOT NULL,
  `FKproductID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `orderitem`
--

INSERT INTO `orderitem` (`orderItemID`, `quantity`, `FKorderID`, `FKproductID`) VALUES
(1, 1, 1, 1),
(2, 1, 1, 3),
(3, 1, 2, 2),
(4, 5, 3, 4),
(5, 2, 4, 1),
(6, 1, 4, 2);

-- --------------------------------------------------------

--
-- Table structure for table `orders`
--

CREATE TABLE `orders` (
  `orderID` int(11) NOT NULL,
  `ordernr` int(11) NOT NULL,
  `FKtableID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `orders`
--

INSERT INTO `orders` (`orderID`, `ordernr`, `FKtableID`) VALUES
(1, 1, 1),
(2, 2, 1),
(3, 3, 1),
(4, 4, 2);

-- --------------------------------------------------------

--
-- Table structure for table `products`
--

CREATE TABLE `products` (
  `productID` int(11) NOT NULL,
  `product_name` text NOT NULL,
  `product_price` decimal(4,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `products`
--

INSERT INTO `products` (`productID`, `product_name`, `product_price`) VALUES
(1, 'cola', '2.50'),
(2, 'pepsi', '2.50'),
(3, 'egg', '6.00'),
(4, 'cake', '10.00');

-- --------------------------------------------------------

--
-- Table structure for table `tables`
--

CREATE TABLE `tables` (
  `tableID` int(11) NOT NULL,
  `tablenr` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `tables`
--

INSERT INTO `tables` (`tableID`, `tablenr`) VALUES
(1, 1),
(2, 2);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `orderitem`
--
ALTER TABLE `orderitem`
  ADD PRIMARY KEY (`orderItemID`),
  ADD KEY `FKorderID` (`FKorderID`),
  ADD KEY `FKproductID` (`FKproductID`);

--
-- Indexes for table `orders`
--
ALTER TABLE `orders`
  ADD PRIMARY KEY (`orderID`),
  ADD KEY `FKtableID` (`FKtableID`);

--
-- Indexes for table `products`
--
ALTER TABLE `products`
  ADD PRIMARY KEY (`productID`);

--
-- Indexes for table `tables`
--
ALTER TABLE `tables`
  ADD PRIMARY KEY (`tableID`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `orderitem`
--
ALTER TABLE `orderitem`
  MODIFY `orderItemID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

--
-- AUTO_INCREMENT for table `orders`
--
ALTER TABLE `orders`
  MODIFY `orderID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

--
-- AUTO_INCREMENT for table `products`
--
ALTER TABLE `products`
  MODIFY `productID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

--
-- AUTO_INCREMENT for table `tables`
--
ALTER TABLE `tables`
  MODIFY `tableID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- Constraints for dumped tables
--

--
-- Constraints for table `orderitem`
--
ALTER TABLE `orderitem`
  ADD CONSTRAINT `orderitem_ibfk_1` FOREIGN KEY (`FKorderID`) REFERENCES `orders` (`orderID`),
  ADD CONSTRAINT `orderitem_ibfk_2` FOREIGN KEY (`FKproductID`) REFERENCES `products` (`productID`);

--
-- Constraints for table `orders`
--
ALTER TABLE `orders`
  ADD CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`FKtableID`) REFERENCES `panbake`.`tafels` (`tafelID`);
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Требуемые данные будут такими, но в случае ordernr только самые высокие, а не все ordernr: https://snag.gy/kUln45.jpg

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

В MySQL вам необходимо:

set @tablenr = 1; --You are able to change the variable value here

select Product_name, quantity, product_price, ordernr, tablenr
from (
select Product_name, quantity, product_price, ordernr, tablenr, rank() over (order by ordernr desc) rnk
FROM orderitem oi
    INNER JOIN products p ON oi.FKproductID = p.productID
    INNER JOIN orders o ON oi.FKorderID = o.orderID
    INNER JOIN tables t ON o.FKtableID = t.tableID
    where tablenr = @tablenr ) a 
    where rnk = 1

Вот результат теста:

DB <> Fiddle

0 голосов
/ 25 апреля 2019

Если вы используете агрегатную функцию или группирование, все, что выбирается в одном запросе, должно быть агрегированным ИЛИ, включенным в группу.Можете ли вы разбить часть вашего запроса на подзапрос, а затем присоединиться к родителю?

SELECT products.product_name, orderitem.quantity, products.product_price
FROM Products
INNER JOIN orderitem on orderitem.FK = products.id
INNER JOIN(
     SELECT MAX(orders.ordernr), tables.tablelnr, orders.ID 
     FROM Orders
     INNER JOIN tables on orders.FK = tables.tableID
     WHERE tables.tablelnr = '1'
     GROUP BY Tables.tablelnr, orders.id) as tbl
ON products.fk = tbl.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...