@YakutD

Почему OR проверяет оба условия при выполнении хотя бы одного?

Есть карточки товаров, у которых локализация хранится в отдельной таблице БД. На странице магазина пользователю выводятся те товары, чье описание имеет локализацию на выбранном пользователе языке, если же таковой нет, то показывается карточка товара на английском языка (устанавливается по умолчанию при добавлении товара как первый язык).
Для работы с запросами к БД использую redbeanphp
Вот мой запрос:
SELECT game_text_info.title, game_text_info.descr, games.* 
  FROM game_text_info,games 
  WHERE game_text_info.game_id = games.id 
     AND (game_text_info.local = :local OR game_text_info.local = "en") 
     AND game_text_info.title LIKE :search'

Если язык пользователя равна 'en', то все хорошо. Но если стоит русский язык ('ru'), то запрос выводит как те товары у которых есть русское описание, так и их же английские варианты. Полагаю дело в том что выборка из разных таблиц и в этом и кроется причина. Как быть?
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
LaRN
@LaRN
Senior Developer
Если английская версия есть всегда, а другие опционально, можно так попробовать:
SELECT ISNULL(i2.title, i1.title) as title, ISNULL(i2.descr, i1.descr) as descr, gg.* 
  FROM game_text_info as i1
 INNER JOIN games as gg
         ON gg.id = i1.game_id
  LEFT JOIN game_text_info as i2
         ON i2.game_id = i1.game_id 
        AND i2.game_text_info.local = :local
 WHERE i1.title LIKE ':search'
   and i1.game_text_info.local = "en"
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Вот ту вы явно указываете что local может быть равно тому что в :local или 'en'
(game_text_info.local = :local OR game_text_info.local = "en")

чего вы ждали ?
у вас в запросе соединение - один ко многим, на одну строку из таблицы games вы цепляете все строки из game_text_info которые подходят под условие в WHERE
Я не знаю есть ли в MySQL HAVING но он бы тут помог
Залейте пример на sqlfiddle.com
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Сначала game_text_info.local = :local, потом UNION и оставшиеся game_text_info.local = "en". Повтора не будет.
описание товара может отсутствовать на языке пользователя, поэтому ему предлагается прочесть английскую версию
В подзапросе найдите нужный вам товар, свяжите с ним описания два раза (локальную и английскую версию) при оcотсутствии первой показывайте вторую.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы