@Sofard

При выборке двух таблиц с БД одним запросом, на выводе получаются дубликаты. В чем может быть проблема?

Здравствуйте! Когда я выбираю две таблицы с БД, получается так, что у меня выводятся дубликаты товаров. То, что я понял, количество дубликатов зависит от того, сколько строк в другой таблице.
Есть таблица `table_products` и `cart`. Каждая строка при выводе с таблице `table_products`, выводиться столько раз, сколько строк в таблице `cart`.
Пример: в `table_products` 2 строки, NAME_1 и NAME_2 . В `cart` 4 строки.
ВЫВОД: NAME_1 NAME_1 NAME_1 NAME_1 NAME_2 NAME_2 NAME_2 NAME_2

Вот мой запрос:
$query = $pdo->query("SELECT * FROM table_products, cart");
while ($row = $query->fetch(PDO::FETCH_OBJ)) {
<div class="product" id="<?php echo"$row->products_id"; ?>">
<img src="<?php echo"$row->image"; ?>" class="image-product">
<div class="title-prod"><h2><a href="product.php?id=<?php echo "$row->products_id"; ?>"><?php echo "$row->title"; ?></a></h2></div>
}

___
Всем спасибо! Все кто ответил, дали мне правильное решения моей проблемы, огромное спасибо Вам!
PS: Мой запрос теперь такой: SELECT * FROM table_products LEFT JOIN cart ON table_products.products_id = cart.cart_id_products
  • Вопрос задан
  • 239 просмотров
Решения вопроса 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы делаете выборку декартова произведения двух таблиц. Значит на выходе у вас все возможные пары строк из первой и второй таблиц.
Ответ написан
iResource
@iResource
Разработчик IR XML2Ozon
Если у этих таблиц есть поля, по которым их можно связать (с одинаковыми значениями), например id или что-то в этом роде, то Вы можете связать их примерно так:
SELECT с.*, p.*
FROM cart с
LEFT JOIN table_products p ON p.id = c.products_id
LIMIT 10000

Если в таблицах названия каких-то столбцов совпадают, надо это SELECT с.*, p.* переписать, указав конкретные столбцы, иначе будет неопределённость.
Ответ написан
Комментировать
@alexalexes
Если просто нужен флаг, что товар в корзине, то достаточно этого запроса.
SELECT p.*,
            case
               when exists(SELECT 1 from cart c where c.products_id = p.id)
               then 1
               else 0
            end is_exists_in_cart -- есть товар к корзине? 0 - нет, 1 - есть
FROM table_products p

Если нужны параметры товара, а не только его наличие, то как минимум будет такая конструкция:
SELECT p.*, c.*
FROM table_products p
left join cart c on c.products_id = p.id

PS: Конструкция запроса может сильно меняться от того, какие свойства вам нужно извлечь, чтобы вывести в итоговую выборку.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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