@hiGRND

Есть ли более компактный способ сделать выборку из БД?

Мне необходимо вывести список товаров из таблицы.
У каждого товара в таблице есть отдельные столбцы с откатками товара в каждом из магазинов (Столбец t1, t2, t3, t4....t17)

Мне необходимо вывести только те товары, которые есть в наличии хотя бы в одном из магазинов.

Сейчас реализовал таким способом
$sql = "SELECT * FROM products WHERE category = ? AND (t1 > 0 OR t2 > 0 OR t3 > 0 OR t4 > 0 OR t5 > 0 OR t6 > 0 OR t7 > 0 OR t8 > 0 OR t9 > 0 OR t10 > 0 OR t11 > 0 OR t12 > 0 OR t13 > 0 OR t14 > 0 OR t15 > 0 OR t16 > 0 OR t17 > 0)";


Но уверен есть решение элегантнее и разумнее)
Или это ок?
  • Вопрос задан
  • 140 просмотров
Решения вопроса 3
@maksam07
Но уверен есть решение элегантнее и разумнее)

Вы это решение найдете значительно быстрее, когда прочитаете о нормализации базы данных. Если не ошибаюсь, то 10 основных норм достаточно, для проектирования более хороших бд.

UPD. С числом ошибся. Я имел в виду первые 3 нормальных формы. Кто хочет большему количеству форм соответствовать - пожалуйста

Или это ок?

В текущем варианте - ок.
Ответ написан
kawabanga
@kawabanga
Для той постановки задачи что вы задали

function generateTFilter($numT) {
    $filter = "";
    for ($i = 1; $i <= $numT; $i++) {
        $filter .= " OR t{$i} > 0";
    }
    return ltrim($filter, " OR");
}

$numT = 17; // Укажите нужное количество переменных t

$sql = "SELECT * FROM products WHERE category = ? AND (" . generateTFilter($numT) . ")";


Но, представьте, что магазинов станет 50 или 100? А как вы будете считать приход и списание со складов? А товары в пути? Вам бы продумать архитектуру хорошенько.
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
При такой схеме хранения другого решения нет.
Если хранить остатки не в колонках, а в нормальной отдельной таблице, то можно будет использовать WHERE … IN.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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