sql многостоловый запрос - PullRequest
0 голосов
/ 15 января 2019

У меня есть 3 связанные таблицы, и я хотел бы показать с запросом sql таблицу с "titulo" таблицы "recetas" с выбранной "категориями" таблицы "категориями", рецепт может иметьболее чем одной категории для этого я создал таблицу "recetas -ategorias", я пытался с подзапросами, но я не понимаю, я новичок в sql.

SELECT r.titulo 
 FROM recetas r 
WHERE r.idreceta=(SELECT rc.idreceta 
                   FROM recetas-categorias 
                  WHERE rc.idcategoria=(SELECT id 
                                         FROM categorias c 
                                        WHERE c.categoria="Internacional"));

отношениятри таблицы

таблица категорий

таблица приемов-категорий

таблица приемов

Прикрепленный код структуры и данных

Таблица Recetas

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

DROP TABLE IF EXISTS `recetas`;
CREATE TABLE IF NOT EXISTS `recetas` (
  `idreceta` int(11) NOT NULL AUTO_INCREMENT,
  `titulo` varchar(255) COLLATE utf8_spanish2_ci NOT NULL,
  `contenido` mediumtext COLLATE utf8_spanish2_ci NOT NULL,
  `fecha` date NOT NULL,
  `idusuario` varchar(255) COLLATE utf8_spanish2_ci NOT NULL,
  `imagenprincipal` varchar(255) COLLATE utf8_spanish2_ci NOT NULL,
  `valoracion` float DEFAULT NULL,
  PRIMARY KEY (`idreceta`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;

INSERT INTO `recetas` (`idreceta`, `titulo`, `contenido`, `fecha`, `idusuario`, `imagenprincipal`, `valoracion`) VALUES
(1, 'Paella mixta', '<ul class=\"list-group\">\r\n  <li class=\"list-group-item\">Cras justo odio</li>\r\n  <li class=\"list-group-item\">Dapibus ac facilisis in</li>\r\n  <li class=\"list-group-item\">Morbi leo risus</li>\r\n  <li class=\"list-group-item\">Porta ac consectetur ac</li>\r\n  <li class=\"list-group-item\">Vestibulum at eros</li>\r\n</ul>', '2019-01-15', '1', 'paella.jpg', NULL),
(2, 'Boquerones', '<ul class=\"list-group\">\r\n  <li class=\"list-group-item\">Cras justo odio</li>\r\n  <li class=\"list-group-item\">Dapibus ac facilisis in</li>\r\n  <li class=\"list-group-item\">Morbi leo risus</li>\r\n  <li class=\"list-group-item\">Porta ac consectetur ac</li>\r\n  <li class=\"list-group-item\">Vestibulum at eros</li>\r\n</ul>', '2019-01-24', '1', 'boquerones.jpg', NULL),
(3, 'Salchichas', '<ul class=\"list-group\">\r\n  <li class=\"list-group-item\">Cras justo odio</li>\r\n  <li class=\"list-group-item\">Dapibus ac facilisis in</li>\r\n  <li class=\"list-group-item\">Morbi leo risus</li>\r\n  <li class=\"list-group-item\">Porta ac consectetur ac</li>\r\n  <li class=\"list-group-item\">Vestibulum at eros</li>\r\n</ul>', '2019-01-24', '1', 'salchi.jpg', NULL);
COMMIT;

таблица приёмов-категорий

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

DROP TABLE IF EXISTS `recetas-categorias`;
CREATE TABLE IF NOT EXISTS `recetas-categorias` (
  `idreceta` int(11) NOT NULL,
  `idcategoria` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;

INSERT INTO `recetas-categorias` (`idreceta`, `idcategoria`) VALUES
(1, 6),
(1, 14),
(3, 9),
(3, 14),
(2, 10);
COMMIT;

таблица категорий

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

DROP TABLE IF EXISTS `categorias`;
CREATE TABLE IF NOT EXISTS `categorias` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categoria` varchar(255) COLLATE utf8_spanish2_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;

INSERT INTO `categorias` (`id`, `categoria`) VALUES
(1, 'Sopas y cremas'),
(2, 'Salsas'),
(3, 'Potajes'),
(4, 'Ensaladas'),
(5, 'Pastas'),
(6, 'Arroces'),
(7, 'Legumbres'),
(8, 'Huevos'),
(9, 'Carnes'),
(10, 'Pescados'),
(11, 'Mariscos'),
(12, 'Cocteles y refrescos'),
(13, 'Postres y repostería'),
(14, 'Internacional'),
(15, 'Robot de cocina');
COMMIT;

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Я думаю, что, поняв ваш вопрос, вы, вероятно, хотите познакомиться с объединениями таблиц MySQL.

Это широкая категория, слишком широкая для ответа здесь, поэтому, вероятно, лучше направить вас куда-нибудь, например, http://www.mysqltutorial.org/mysql-join/, чтобы узнать, что они из себя представляют и как они используются.

С точки зрения вашего запроса, следующая поправка:

SELECT r.titulo 
 FROM `categorias` c 
INNER JOIN `recetas-categorias` rc ON rc.idcategoria= c.id
INNER JOIN `recetas` r ON r.idreceta = rc.idreceta
WHERE c.categoria="Internacional"

1010 * возвращается *

+-------------+
| paella      |
|-------------|
| salchichas  |
+-------------+

... что вы пытаетесь достичь?

0 голосов
/ 15 января 2019

Для этой операции используйте join .

SELECT r.titulo 
 FROM recetas r 
JOIN recetas-categorias rc
ON r.idreceta = rc.idreceta  
JOIN categorias c
ON rc.idcategoria = c.id
AND c.categoria="Internacional"

или

SELECT r.titulo 
FROM recetas r,
     recetas-categorias rc,
     categorias c
WHERE r.idreceta = rc.idreceta  
AND rc.idcategoria = c.id
AND c.categoria="Internacional"
0 голосов
/ 15 января 2019

Вам необходимо узнать о "sql joins".Вот как вы объединяете эти 3 таблицы:

    select r.titulo
    from recetas r
    join recetas-categorias rc
        on rc.idreceta = r.idreceta
    join categorias c
        on c.id = rc.idcategoria
    where c.categoria = 'Internacional'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...