MySQL SELECT женщины, а не мужчины

0

У меня есть поле в моей базе данных, которое называется категориями, которые содержат категории тем для магазина одежды (New Arrival, Top Sellers, Men, Women, Kids и т.д.).

У меня есть одна запись, которая имеет: New Arrival, Men У меня есть вторая запись, в которой есть: "Новое прибытие", "Женщины"

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

Я устал от этого: SELECT * FROM products WHERE categories RLIKE [[:<:]]Men[[:>:]]'

Это работает для мужчин, но это не работает для женщин.

  • 0
    Как насчет условия ИЛИ ГДЕ категория = мужчины ИЛИ категория = женщины?
  • 4
    Вот почему у нас нормализация . Там должна быть отдельная таблица: Categories . Связан с таблицей « Products помощью FOREIGN KEY в таблице соединений ProductCategories . По сути, вы делаете это неправильно. То, что вы делаете, описано в книге «Антипаттерны SQL» , первая глава: Jaywalking.
Показать ещё 4 комментария
Теги:

5 ответов

4
Лучший ответ

Хорошо, если вы на самом деле сохраняете слова "Мужчины" или "Женщины", ваша база данных настроена неправильно

Вы должны использовать связанную таблицу, скажем categories, чтобы связать продукты с категориями.

Затем вы можете сделать что-то вроде:

SELECT * FROM products p
JOIN categoriesToProducts ctp ON ctp.productId = p.productId
JOIN categories c ON c.categoryId = ctp.categoryId
WHERE c.categoryName = "Men"; 
  • 0
    Спасибо, я пересмотрю свою структуру.
  • 0
    @ m1a2x3x7 нет проблем, рад помочь ^ _ ^
1

вы можете использовать find_in_set function, посмотрите на этот пример

mysql> select * from fruits;
+-------------------------------+
| fruit                         |
+-------------------------------+
| banana, apple, orange, grapes |
+-------------------------------+
1 row in set (0.00 sec)

mysql> select * from fruits where find_in_set('banana',fruit);
+-------------------------------+
| fruit                         |
+-------------------------------+
| banana, apple, orange, grapes |
+-------------------------------+
1 row in set (0.00 sec)

Итак, попробуйте что-то вроде:

SELECT * FROM products WHERE categories where find_in_set('men',categories)'

убедитесь, что слово после , точно такое же, без дополнительного пространства

  • 0
    Ehhhhh это последняя часть, которая получает меня ... Это не нормализованная таблица ...
  • 0
    @neal Я согласен с тобой, я думаю, именно этого он и хочет, потому что мы даже не видим структуру стола или то, что он хочет в точности
1

просто используйте это:

SELECT * FROM products WHERE categories LIKE 'Men%';
SELECT * FROM products WHERE categories LIKE 'Women%';

используйте только правильный%

  • 1
    или создайте таблицу категорий, объедините продукты с категориями и используйте что-то вроде 'WHERE category_id = x'
  • 0
    Какая категория таблицы?
-1

Поскольку у вас нет проблем с выбором "Женщины", вы можете решить его в случае с мужчинами, используя такой запрос:

SELECT * FROM products WHERE categories LIKE '% Men';

Просто поставьте пробел перед буквой "M".

-1

Вы можете просто упростить свой подход.

SELECT * FROM products WHERE categories = 'Men';
SELECT * FROM products WHERE categories = 'Women';

Так как "Мужчины" отделены от "WoMEN", это может быть причиной того, что ваш sql имеет проблемы?

Однако, поскольку это было доведено до моего сведения, ваша БД может содержать более длинную строку, которую вы могли бы также сделать.

SELECT * FROM products WHERE categories = 'New Arrival, Men';
SELECT * FROM products WHERE categories = 'New Arrival, Women';
  • 0
    Похоже, что в ОП есть вся строка « New Arrival, Women или « New Arrival, Men в базе данных ... Так что это не сработает ....
  • 0
    Оу ... ОП специально не хочет выделять всю строку ....
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню