powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка "многие-ко-многим"
2 сообщений из 2, страница 1 из 1
Выборка "многие-ко-многим"
    #38531327
GatuZa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть 3 таблицы (проекты, работники и линкующая таблица)

не могу понять как максимально эффективно выбрать id проекта и количество работников, которые в него можно добавить (которые не добавлены еще в этот проект)

ДАМП:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Дамп структуры для таблица edsson.ua.p2w
DROP TABLE IF EXISTS `p2w`;
CREATE TABLE IF NOT EXISTS `p2w` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`p_id` int(11) NOT NULL,
`w_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `p_id_w_id` (`p_id`,`w_id`),
KEY `FK_p2w_workers` (`w_id`),
CONSTRAINT `FK_p2w_projects` FOREIGN KEY (`p_id`) REFERENCES `projects` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_p2w_workers` FOREIGN KEY (`w_id`) REFERENCES `workers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8 COMMENT='link table (we also can create PRIMARY(p_id,w_id) without id)';

-- Дамп данных таблицы edsson.ua.p2w: ~2 rows (приблизительно)
/*!40000 ALTER TABLE `p2w` DISABLE KEYS */;
REPLACE INTO `p2w` (`id`, `p_id`, `w_id`) VALUES
(98, 7, 18),
(97, 7, 19),
(99, 7, 21),
(96, 7, 22),
(103, 8, 18),
(101, 8, 19),
(104, 8, 21),
(100, 8, 22),
(108, 9, 21),
(105, 9, 22),
(110, 29, 19),
(113, 30, 22);
/*!40000 ALTER TABLE `p2w` ENABLE KEYS */;


-- Дамп структуры для таблица edsson.ua.projects
DROP TABLE IF EXISTS `projects`;
CREATE TABLE IF NOT EXISTS `projects` (
`id` int(1) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
`description` char(50) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;

-- Дамп данных таблицы edsson.ua.projects: ~4 rows (приблизительно)
/*!40000 ALTER TABLE `projects` DISABLE KEYS */;
REPLACE INTO `projects` (`id`, `name`, `description`, `created_at`) VALUES
(7, 'project 1', 'blablabla', '2014-01-17 01:54:56'),
(8, 'project 2', 'blablabla', '2014-01-17 01:55:06'),
(9, 'project 3', 'blblabla', '2014-01-17 01:55:20'),
(29, 'project 4', 'blblabla', '2014-01-17 01:55:20'),
(30, 'project 5', NULL, '2014-01-19 22:45:11');
/*!40000 ALTER TABLE `projects` ENABLE KEYS */;


-- Дамп структуры для таблица edsson.ua.workers
DROP TABLE IF EXISTS `workers`;
CREATE TABLE IF NOT EXISTS `workers` (
`id` int(1) NOT NULL AUTO_INCREMENT,
`name` char(10) NOT NULL,
`birthday` date NOT NULL,
`email` char(20) NOT NULL,
`salary` smallint(6) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;

-- Дамп данных таблицы edsson.ua.workers: ~2 rows (приблизительно)
/*!40000 ALTER TABLE `workers` DISABLE KEYS */;
REPLACE INTO `workers` (`id`, `name`, `birthday`, `email`, `salary`, `created_at`) VALUES
(18, 'SASHA', '0000-00-00', '', 12, '2014-01-19 01:07:16'),
(19, 'KATYA', '0000-00-00', '', 22, '2014-01-19 01:07:16'),
(21, 'SVETA', '0000-00-00', '', 33, '2014-01-19 01:07:16'),
(22, 'DIMA', '1988-11-28', 'adc1000@ukr.net', 1000, '2014-01-19 22:38:56'),
(23, 'OLYA', '1900-10-10', 'a@ukr.net', 600, '2014-01-19 22:45:36');
/*!40000 ALTER TABLE `workers` ENABLE KEYS */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;


Просто интерфейс представляет собой вывод проекта и под ним список работников:
проект 1
- работник 1
-работник 2
проект 2
-работник 1
проект 3
-работник 5

и напротив проекта будет кнопка "добавить работника", короче говоря нужен запрос который выберет к-во работников для каждого проекта, которых еще можно добавить в проект. И в зависимости от к-ва будет доступна или не доступна кнопка добавления. Например если к-во людей, которых еще можно добавить = 0, то кнопка неактивна, если наоборот активна и переход на страницу где в выпадающем списке будут незанятые люди. Дерево выше, построил вот запрос:

SELECT p.id 'p_id', p.name 'p_name', w.id 'w_id', w.name 'w_name'
FROM projects p
LEFT JOIN p2w ON p.id = p2w.p_id
LEFT JOIN workers w ON w.id = p2w.w_id

дальше обрабатываю php

Вообщем если можно эти две операции на вывод дерева и к-во работников "незанятых" обьеденить в один запрос?! Если нет, буду благодарен хотя бы за помощь по запрос на к-во работников, которых можно добавить (грубо говоря count(общее к-во работников - к-во работников занятые в проекте))
...
Рейтинг: 0 / 0
Выборка "многие-ко-многим"
    #38531382
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плясать от
Код: sql
1.
2.
3.
4.
5.
select w.id
from workers w
left join links l
on w.id=l.id
where l.id is null

или аналогичного с использованием NOT IN либо NOT EXISTS
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка "многие-ко-многим"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]