|
|
|
Выборка "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
есть 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(общее к-во работников - к-во работников занятые в проекте)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 05:08:42 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38531382&tid=1835370]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 214ms |
| total: | 322ms |

| 0 / 0 |
