@lemonlimelike

Что не так с запросом?

Всем привет. Хочу сделать правильную выборку по категориям, но чет не получается. Имеется таблица categories, которая состоит из таких полей: id, name, en. поле name содержит имя категорий на русском языке, а en поле на англ. языке. И имеется таблица main, в ней есть поле genre, которое содержит имена нескольких категорий на русс.языке, к примеру так большой, красный, ровный. Думаю с этим понятно.
Так вот, по переходу на стр категории на сервер приходит англ имя категории и соответственно нужно сделать выборку по этой категории.
Вот мой запрос, но он почему-то выбирает записи у которых строго эта категория, которую я указал, а нужно все записи у которых в поле genre присутствует данная категория.
select f.id,f.title_ru,f.genre from main as f  where genre in (select name from categories where en = 'big');
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
irishmann
@irishmann
Научись пользоваться дебаггером
Создал таблицы categories, main и заполнил их
-- -- -- спойлер: SQL на создание и заполнение -- -- --
-- phpMyAdmin SQL Dump
-- version 4.8.3
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1:3306
-- Время создания: Мар 11 2019 г., 14:41
-- Версия сервера: 5.5.61-MariaDB
-- Версия PHP: 5.6.38

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


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `test`
--

-- --------------------------------------------------------

--
-- Структура таблицы `categories`
--

CREATE TABLE `categories` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `en` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `categories`
--

INSERT INTO `categories` (`id`, `name`, `en`) VALUES
(1, 'большой', 'big'),
(2, 'красный', 'red'),
(3, 'ровный', 'smooth');

-- --------------------------------------------------------

--
-- Структура таблицы `main`
--

CREATE TABLE `main` (
  `id` int(11) NOT NULL,
  `simple` varchar(255) NOT NULL,
  `genre` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `main`
--

INSERT INTO `main` (`id`, `simple`, `genre`) VALUES
(1, 'Какой-то', 'red'),
(2, 'текст', 'red'),
(3, 'для', 'red'),
(4, 'проверки', 'red'),
(5, 'запроса', 'red'),
(6, 'типа red', 'red'),
(7, 'my dick', 'big'),
(8, 'is big', 'big'),
(9, 'my dick', 'big'),
(10, 'is very big', 'big'),
(11, 'Little', 'big'),
(12, 'Big', 'big'),
(13, 'Group', 'big'),
(14, 'Track', 'big'),
(15, 'Big Dick', 'big'),
(16, 'Вообще', 'smooth'),
(17, 'Вообще', 'smooth'),
(18, 'не', 'smooth'),
(19, 'имею', 'smooth'),
(20, 'малейшего', 'smooth'),
(21, 'понятия', 'smooth'),
(22, 'что', 'smooth'),
(23, 'тут', 'smooth'),
(24, 'написать', 'smooth'),
(25, 'для', 'smooth'),
(26, 'теста', 'smooth'),
(27, 'но', 'smooth'),
(28, 'и', 'smooth'),
(29, 'так', 'smooth'),
(30, 'сойдет', 'smooth');

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `categories`
--
ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);

--
-- Индексы таблицы `main`
--
ALTER TABLE `main`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `categories`
--
ALTER TABLE `categories`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT для таблицы `main`
--
ALTER TABLE `main`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=31;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


И вот таким образом вытащил нужные мне данные.
SELECT
	m.id as main_id,
	m.simple as main_simple,
	m.genre as main_genre,
	c.id as categories_id,
	c.name as categories_name,
	c.en as categories_en
FROM 
	main m
	LEFT JOIN categories c on m.genre = c.en
WHERE 
	c.en LIKE '%big%'

-- -- -- спойлер: Несколько скриншотов -- -- --

LIKE '%big%'
5c864bb6015a1003216827.png

LIKE '%red%'
5c864bbf05f17153534338.png

LIKE '%smooth%'
5c864bcc13fc3849509456.png


Этот метод работает как и на MySQL, так и на PostgreSQL, если кому интересно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А в таблице categories категории, небось, через запятую записаны?
Приведите таблицы в нормальную форму и будет вам счастье.
Ответ написан
@Tabris17
Правильно реализуйте связь многие ко многим
примерно так
slide-33.jpg

PS ну на крайний случай можно попробовать так
select f.id,f.title_ru,f.genre from main as f  where genre like (select '%' || name || '%' from categories where en = 'big');
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы