Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22

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

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

Студворк — интернет-сервис помощи студентам
Имеется таблица (записи не имеющие 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2017, 22:55
Ответы с готовыми решениями:

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

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

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

8
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
14.04.2017, 13:31
'Рассрочка без процентов' никак не подойдет под условие `name` LIKE '%Кред%', поэтому в таком примитивном виде вряд ли запрос заработает.
Учитывая, что таблица связана сама с собой, глупо не связать их и в запросе. Поэтому ясный и прозрачный запрос явно должен иметь другую структуру, поэтому "пилите, Шура, пилите ..."
Цитата Сообщение от DedSoul Посмотреть сообщение
Два дня мучаюсь, не могу справиться.
Когда откажетесь от
Цитата Сообщение от DedSoul Посмотреть сообщение
"готовую" часть запроса изменять нельзя
отпишитесь
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
14.04.2017, 15:33
mysql обсуждается в другом форуме.
а по существу, вам нужен иерархический запрос с дополнительным условием относительно "name".
0
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22
15.04.2017, 14:55  [ТС]
а как тогда можно описать этот запрос?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.04.2017, 14:57
так MySQL или PostgreSQL?
0
0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 22
15.04.2017, 15:00  [ТС]
PostgreSQL
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.04.2017, 15:10
Лучший ответ Сообщение было отмечено 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  [ТС]
Огромное спасибо, добрый человек)
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.04.2017, 15:23
Ты проверь сначала его работоспособность, запрос писался на коленке и в блокноте

Добавлено через 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.04.2017, 15:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru