Многократный оператор LIKE ORDER BY Strongest - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть следующий запрос:

SELECT * FROM table_name
WHERE (genre LIKE '%romance%'
    OR genre LIKE '%comedy%'
    OR genre LIKE '%horror%')
ORDER BY *the column that has more*

ИЛИ ЧТО-ТО КАК ТО, ЧТО

$sql = "SELECT * FROM table WHERE
(genre LIKE '%romance%' AND genre LIKE '%comedy%' AND genre LIKE '%horror%')
#If result < 12
(genre LIKE '%romance%' AND genre LIKE '%comedy%') OR (genre LIKE '%romance%' AND genre LIKE '%horror%') OR (genre LIKE '%comedy%' AND genre LIKE '%horror%')
#If result < 12
(genre LIKE '%romance%' OR genre LIKE '%comedy%' OR genre LIKE '%horror%')";

Я имею в виду, если есть мов ie имеет эти три жанра, я хочу его получить сначала я получаю mov ie, в котором есть романтика и комедия или романтика и ужас, или комедия и ужас.

Ответы [ 2 ]

4 голосов
/ 15 апреля 2020

Условный оператор возвращает 1, когда он равен true, 0, когда он равен false. Поэтому сложите количество совпадений.

ORDER BY (genre LIKE '%romance%')
        + (genre LIKE '%comedy%')
        + (genre LIKE '%horror%') DESC

DEMO

Было бы лучше нормализовать ваши таблицы. Добавьте таблицу movie_genre как

CREATE TABLE movie_genre (
    movie_id INT(11) NOT NULL, # foreign key to movie.id
    genre_id INT(11) NOT NULL  # foreign key to genre.id
);

Тогда вы сделаете запрос вроде:

SELECT m.* 
FROM movie AS m
JOIN movie_genre AS mg ON m.id = mg.movie_id
JOIN genre AS g ON g.id = mg.genre_id
WHERE g.name IN ('comedy', 'romance', 'horror')
GROUP BY m.id
ORDER BY COUNT(*) DESC
0 голосов
/ 15 апреля 2020
SELECT * FROM movies
WHERE (genre LIKE '%romance%'
    OR genre LIKE '%comedy%'
    OR genre LIKE '%horror%')
ORDER BY (genre LIKE '%romance%')
        + (genre LIKE '%comedy%')
        + (genre LIKE '%horror%') DESC

Большое спасибо, Бармар

...