Запрос на выборку записей из many to many таблиц

180
05 апреля 2022, 15:30

Есть две таблицы Tag(id, name) , Certificate(id, name,description,...), связаны связью многие ко многим, соответственно есть и так называемая XREF таблица,в которой ключи это ключи этих двух таблиц. Нужно написать запрос, который будет выбирать сертификаты по имени тегов(их может быть несколько), у меня получилось что-то такое, но это весьма спорно решение, на мой взгляд.

SELECT DISTINCT G.gift_certificate_id, g.name, description, price, create_date, last_update_date, duration, group_concat(T.name order by T.name) as 'tags' FROM gift_certificate G 
JOIN tag_gift_certificate TG ON G.gift_certificate_id=TG.gift_certificate_id 
JOIN TAG T ON TG.tag_id=T.tag_id
group by G.gift_certificate_id
having tags LIKE '%food%' AND tags LIKE '%kfc%'

Другого решения в упор не вижу, может подскажете?) Добавил скрипты для создания таблиц. Для запроса, который я написал результатом должен быть 1 сертификат с id 13.

CREATE TABLE `gift_certificate` (
  `gift_certificate_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `description` varchar(100) DEFAULT NULL,
  `price` decimal(8,2) DEFAULT NULL,
  `create_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `last_update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `duration` int(5) DEFAULT NULL,
  PRIMARY KEY (`gift_certificate_id`)
)
INSERT INTO `gift_certificate` VALUES (9,'pizza_certificate','50% discount for 5 pizzas',10.50,'2020-01-18 15:53:21','2020-01-18 15:53:21',4),(11,'ninja_sushi_certificate','every second sushi is free',3.00,'2020-01-18 15:58:24','2020-01-18 15:58:24',2),(12,'salad','every salad 25% discount',2.00,'2020-01-18 15:59:14','2020-01-19 18:49:53',1),(13,'kfc_delivery_ceritificate','free delivery over 10$ ',2.50,'2020-01-18 16:00:52','2020-01-18 16:00:52',10),(47,'certificate_for_rent_car','car rent xml description',3.55,'2020-01-20 21:36:26','2020-01-25 12:59:08',3);
CREATE TABLE `tag` (
  `tag_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`tag_id`)
)
INSERT INTO `tag` VALUES (6,'pizza'),(8,'certificate'),(9,'car'),(12,'sushi'),(13,'food'),(14,'delivery'),(15,'salad'),(16,'kfc'),(21,'tasty'),(53,'rent');
CREATE TABLE `tag_gift_certificate` (
  `tag_id` int(11) NOT NULL,
  `gift_certificate_id` int(11) NOT NULL,
  PRIMARY KEY (`tag_id`,`gift_certificate_id`),
  KEY `fk_tag_gift_certificate_gift_certificate_gift_certificate_i_idx` (`gift_certificate_id`),
  KEY `fk_tag_gift_certificate_gift_tag_tag_id_idx` (`tag_id`),
  CONSTRAINT `fk_tag_gift_certificate_gift_certificate_gift_certificate_id` FOREIGN KEY (`gift_certificate_id`) REFERENCES `gift_certificate` (`gift_certificate_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_tag_gift_certificate_gift_tag_tag_id` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`tag_id`) ON DELETE CASCADE
)
INSERT INTO `tag_gift_certificate` VALUES (6,9),(8,9),(12,11),(13,11),(14,11),(13,12),(14,12),(15,12),(21,12),(13,13),(14,13),(16,13),(9,47),(53,47);
Answer 1
SELECT g.gift_certificate_id, 
       g.name, 
       g.description, 
       g.price, 
       g.create_date,  
       g.last_update_date,  
       g.duration, 
       group_concat(t.name order by t.name) as 'tags'
FROM tag_gift_certificate
JOIN gift_certificate g USING (gift_certificate_id)
JOIN tag t USING (tag_id)
GROUP BY g.gift_certificate_id, 
         g.name, 
         g.description, 
         g.price, 
         g.create_date,  
         g.last_update_date,  
         g.duration
HAVING INSTR(tags, 'food')
   AND INSTR(tags, 'kfc');

fiddle

READ ALSO
Где смотреть методы java

Где смотреть методы java

подскажите пожалуйста новичкуИзучаю java по книге, в ней написано что все методы можно смотреть по адресу java sun, который больше не существует

335
Spring Boot ошибка: Cannot determine embedded database driver class for database type NONE

Spring Boot ошибка: Cannot determine embedded database driver class for database type NONE

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

185
Как сделать всплывающее окно в Android?

Как сделать всплывающее окно в Android?

Как сделать такое окно, которое при нажатии на кнопку будет выводится на экран, а при нажатии на любую другую часть экрана закрывалось?

101