0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22
1

Выборка значений из таблицы

13.04.2017, 22:55. Показов 2389. Ответов 8

Author24 — интернет-сервис помощи студентам
Имеется таблица (записи не имеющие parentCode являются классами, а записи имеющие parentCode являются операциями, которые относятся к соответствующему классу):
SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE CashOperation (
    cashOperationCode INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(25),
    parentCode INT,
    operationType INT,
    timeNorm VARCHAR(10),
    visitCond VARCHAR(10),
    FOREIGN KEY (parentCode)
        REFERENCES CashOperation (cashOperationCode)
);
В программе вводится значение поля name, нужно произвести поиск:
1. если совпадения только в классах (parentCode is null), то вывести подходящие названия классов и только те операции, которые соответствуют найденным классам.

2. если совпадения только в операциях(parentCode is not null), то вывести подходящие названия операций и только те классы, которые соответствуют найденным операциям.

3. если совпадения одновременно в операциях и в классах, то выполнить пункт 1.

Например мы заполнили таблицу записями:
SQL
1
2
3
4
5
6
INSERT INTO CashOperation (`name`) VALUES ('Обменные');
INSERT INTO CashOperation (`name`) VALUES ('Кредитные');
INSERT INTO CashOperation (`name`, parentCode) VALUES ('обмен долларов', 1);
INSERT INTO CashOperation (`name`, parentCode) VALUES ('обмен евро', 1);
INSERT INTO CashOperation (`name`, parentCode) VALUES ('Кредит месячный', 2);
INSERT INTO CashOperation (`name`, parentCode) VALUES ('Рассрочка без процентов', 2);
При вводе в поиск "кред" должно вывести записи: Кредитные, Кредит месячный, Рассрочка без процентов.

Есть часть запроса, осталось только дописать условия вместо "...":

SQL
1
2
3
4
5
6
7
8
SELECT 
    *
FROM
    CashOperation
WHERE
    (parentCode IS NULL
        AND `name` LIKE '%Кред%' AND ...)
        OR (parentCode IS NOT NULL AND ...)
Два дня мучаюсь, не могу справиться.

P.s. структуру таблицы и "готовую" часть запроса изменять нельзя
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2017, 22:55
Ответы с готовыми решениями:

Выборка определенных значений из таблицы
Доброго времени суток. Необходимо сделать выборку из базы определенных значений. То есть. Есть...

Выборка значений из таблицы подстановок по условию
Здравствуйте. Есть таблица: список мониторов, в этой таблице имеются поля: наименование монитора,...

Выборка данных из таблицы по конкретному массиву значений
Доброго времени суток! Прошу вашей помощи или совета по следующему вопросу. Предполагаем, что в...

Выборка из 1 таблицы суммы значений, удовлетворяющие условиям
Здравствуйте, уважаемые форумчане. Весь день ломал голову, но так и не победил. Суть вопроса...

8
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
14.04.2017, 13:31 2
'Рассрочка без процентов' никак не подойдет под условие `name` LIKE '%Кред%', поэтому в таком примитивном виде вряд ли запрос заработает.
Учитывая, что таблица связана сама с собой, глупо не связать их и в запросе. Поэтому ясный и прозрачный запрос явно должен иметь другую структуру, поэтому "пилите, Шура, пилите ..."
Цитата Сообщение от DedSoul Посмотреть сообщение
Два дня мучаюсь, не могу справиться.
Когда откажетесь от
Цитата Сообщение от DedSoul Посмотреть сообщение
"готовую" часть запроса изменять нельзя
отпишитесь
0
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
14.04.2017, 15:33 3
mysql обсуждается в другом форуме.
а по существу, вам нужен иерархический запрос с дополнительным условием относительно "name".
0
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22
15.04.2017, 14:55  [ТС] 4
а как тогда можно описать этот запрос?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.04.2017, 14:57 5
так MySQL или PostgreSQL?
0
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22
15.04.2017, 15:00  [ТС] 6
PostgreSQL
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.04.2017, 15:10 7
Лучший ответ Сообщение было отмечено DedSoul как решение

Решение

даже с with он у меня получился достаточно громоздкий
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WITH co AS (
  SELECT cl.name ClassName, op.name OpName
  FROM 
    CashOperation cl 
    LEFT JOIN CashOperation op ON cl.cashOperationCode = op.parentCode
  WHERE
    cl.parentCode IS NULL
  UNION 
  SELECT cl.name ClassName, op.name OpName
  FROM 
    CashOperation op 
    JOIN CashOperation cl ON cl.cashOperationCode = op.parentCode
)
  SELECT OpName FROM co WHERE OpName LIKE '%Кред%' AND NOT EXIST (
    SELECT ClassName FROM op WHERE ClassName LIKE '%Кред%'
  ) 
  UNION
  SELECT ClassName FROM co WHERE OpName LIKE '%Кред%' AND NOT EXIST (
    SELECT ClassName FROM op WHERE ClassName LIKE '%Кред%'
  ) 
  UNION  
  SELECT ClassName FROM co WHERE ClassName LIKE '%Кред%'
  UNION
  SELECT OpName FROM co WHERE ClassName LIKE '%Кред%' AND OpName IS NOT NULL
P.S. У меня выводятся только name, как в задании, а не * FROM CashOperation
1
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22
15.04.2017, 15:11  [ТС] 8
Огромное спасибо, добрый человек)
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.04.2017, 15:23 9
Ты проверь сначала его работоспособность, запрос писался на коленке и в блокноте

Добавлено через 8 минут
в CTE достаточно первой части. Вторая ничего не дает. У меня там сначала сразу с '%Кред%' сравнение стояло, но после того, как убрал, стоит и вовсе убрать
SQL
1
2
3
4
5
6
7
8
WITH co AS (
  SELECT cl.name ClassName, op.name OpName
  FROM 
    CashOperation cl 
    LEFT JOIN CashOperation op ON cl.cashOperationCode = op.parentCode
  WHERE
    cl.parentCode IS NULL
 )
0
15.04.2017, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2017, 15:23
Помогаю со студенческими работами здесь

Выборка значений таблицы по нескольким заданным полям
Подскажите как можно реализовать следующее: В таблице поля: нужно создать форму,в которой...

Выборка случайных значений из таблицы средствами PHP
Здравствуйте. Скажите пожалуйста, возможно ли средствами PHP вывести случайные значения из MySQL?...

Выборка сразу нескольких значений с одной таблицы
Добрый день. Нужна помощь. Есть ужасная таблица с кучей информации. Хочу вытянуть определенные...

Выборка уникальных значений из одной таблицы и вставка в другую
Добрый день .Выбираю уникальные значения из одной таблицы и вставляю в другую INSERT INTO...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru