Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
1

Несколько LEFT JOIN для одной и той же таблицы

08.11.2018, 19:02. Показов 3359. Ответов 30

Author24 — интернет-сервис помощи студентам
Как правильно сделать 2 запроса LEFT JOIN в одну и ту же таблицу
Есть такой код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<!DOCTYPE html>
<html>
<body>
 
<?php
echo "<table style='border: solid 1px black;'>";
 echo "<tr><th>Id</th><th>Модель</th><th>Цена</th><th>Скидка</th><th>35-37</th><th>38-40</th><th>41-43</th><th>44-46</th><th>Количество</th><th>Сума</th></tr>";
 
class TableRows extends RecursiveIteratorIterator { 
    function __construct($it) { 
        parent::__construct($it, self::LEAVES_ONLY); 
    }
 
    function current() {
        return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";
    }
 
    function beginChildren() { 
        echo "<tr>"; 
    } 
 
    function endChildren() { 
        echo "</tr>" . "\n";
    } 
} 
 
$servername = "servername";
$username = "username";
$password = "password";
$dbname = "dbname";
 
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT
    oc_product.product_id, 
    oc_product.model,
    oc_product.price,
    oc_product_special.price AS price_special,
oc_product_option_value.quantity AS option_quantity
    FROM oc_product
    LEFT JOIN oc_product_special ON oc_product.product_id = oc_product_special.product_id
    LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id WHERE option_value_id IN (31) 
[COLOR="Red"]LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id WHERE option_value_id IN (32) [/COLOR] 
[COLOR="Red"]LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id WHERE option_value_id IN (33) [/COLOR] 
    
    ORDER BY product_id ASC
    ");  
    $stmt->execute();
    
 
    // set the resulting array to associative
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
    
 
    foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
        echo $v;
    
    }
     
 
}
 
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?> 
 
</body>
</html>
Как мне добавлять еще LEFT JOIN oc_product_option_value ON oc_product.product_id = oc_product_option_value.product_id WHERE option_value_id IN (32) и LEFT JOIN oc_product_option_value ON oc_product.product_id = oc_product_option_value.product_id WHERE option_value_id IN (33)
Понимаю что нужно Aliases но не могу впихнуть и край.
Кто в теме, подсобите новичку.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2018, 19:02
Ответы с готовыми решениями:

LEFT JOIN Запров в 3 таблицы одновременно
Вот вроде понимаю, а приминить не могу. Есть допустим 4 таблицы 1)kvart 2)metro 3)type ...

LEFT JOIN
Здравствуйте, очень нужна помощь. Есть две таблицы: Первая : 'id' 'title' 'id_area'...

LEFT JOIN
Есть две таблицы. Нужно взять из таблицы img (id), затем из таблицы comments (img_id = id), делаю...

LEFT JOIN (?)
Привет! Такая ситуация: В столбце «color» данные повторяются (например, 10 разных цветов)....

30
1261 / 959 / 225
Регистрация: 01.10.2018
Сообщений: 3,713
08.11.2018, 21:23 2
Где отдельно имена таблиц упоминаете, там и добавляете алиасы. Поищите примеры по комбинации ключей "Adjacency List" (список смежности, список смежных вершин) и "LEFT JOIN".

Добавлено через 4 минуты
Условие в запросе должно быть одно.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
08.11.2018, 23:21 3
можете перед ORDER BY написать:
SQL
1
WHERE oc_product.product_id IN (31,32,33)
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
09.11.2018, 12:03  [ТС] 4
Для полудух

можете перед ORDER BY написать:

SQL
1
WHERE oc_product.product_id IN (31,32,33)

Чего то я не понял как оно будет брать данные с таблицы oc_product_option_value столбика quantity согласно согласно значение столбика option_value_id.

Добавлено через 51 минуту
Чего-то не клеится.
Если вам не сложно напишите запрос для парочки LEFT JOIN
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
09.11.2018, 12:18  [ТС] 5
Вот так выводит но результат не разбивает на столбики

SQL
1
2
3
4
5
6
7
8
9
10
11
12
    SELECT
oc_product.product_id, 
    oc_product.model,
    oc_product.price,
    oc_product_special.price AS price_special,
    oc_product_option_value.quantity AS option_quantity
    FROM oc_product
    LEFT JOIN oc_product_special ON oc_product.product_id = oc_product_special.product_id
    LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id WHERE (option_value_id IN (32)) OR (option_value_id  IN (31)) OR (option_value_id  IN (43)) OR (option_value_id  IN (49))
      
    
    ORDER BY product_id ASC
Есть идеи как их разбить?
желательно с примером.
Миниатюры
Несколько LEFT JOIN для одной и той же таблицы  
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
09.11.2018, 12:49  [ТС] 6
Или немного короче но все равно не разбивает результат по столбцам
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    oc_product.product_id, 
    oc_product.model,
    oc_product.price,
    oc_product_special.price AS price_special,
    oc_product_option_value.quantity AS option_quantity
    FROM oc_product
    LEFT JOIN oc_product_special ON oc_product.product_id = oc_product_special.product_id
 
    LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id WHERE (option_value_id IN (32, 31, 43, 49 ) )
      
    
    ORDER BY product_id ASC
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
09.11.2018, 19:32 7
вам же сказали, что WHERE ставится НЕ в джойны
вы хотите в результате видеть именно 31,32,33, вот он их и покажет в моём примере
если хотите заджойнить только 31,32,33, а другие НЕ джойнить, то нет, так неэффективно

Добавлено через 5 минут
Цитата Сообщение от Kifir4ik Посмотреть сообщение
Чего то я не понял как оно будет брать данные с таблицы oc_product_option_value столбика quantity согласно согласно значение столбика option_value_id.
никак, у вас option_value_id фигурирует где-то во WHERE, которого там вообще быть не должно
если хотите только его, то во WHERE перед ORDER BY
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
12.11.2018, 11:38  [ТС] 8
Чего-то я совсем путаюсь.
Вот ваш вариант
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
    oc_product.product_id, 
    oc_product.model,
    oc_product.price,
    oc_product_special.price AS price_special,
    oc_product_option_value.quantity AS option_quantity
    FROM oc_product
    LEFT JOIN oc_product_special ON oc_product.product_id = oc_product_special.product_id
    LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id 
    WHERE oc_product.product_id IN (48, 46, 47, 49, 50)
    ORDER BY product_id ASC
Я немного изменил id вывода других опцый товара.
Из за вашего
SQL
1
WHERE oc_product.product_id IN (48, 46, 47, 49, 50)
выводит только товары с id и тоже в 1 столбик, видно на скриншоте 1
А мне нужно чтобы выводило их в рядок. И не id товара 48, 46, 47, 49, 50. а другое.
Попробую объяснить
есть товар id 1 (oc_product.product_id)
так же у его есть модель, цена и скидка (oc_product.model,oc_product.price,oc_product_special.price)
и самое тут геморное это у товара есть 5 опцый (oc_product_option_value.quantity) их id 48, 46, 47, 49, 50 они записаны в oc_product_option_value.option_value_id
Хочу вывести так
|oc_product.product_id | oc_product.model | oc_product.price | oc_product_special.price | oc_product_option_value.quantity у которого oc_product_option_value.option_value_id 48 | oc_product_option_value.quantity у которого oc_product_option_value.option_value_id 46 | oc_product_option_value.quantity у которого oc_product_option_value.option_value_id 47 | oc_product_option_value.quantity у которого oc_product_option_value.option_value_id 49 | oc_product_option_value.quantity у которого oc_product_option_value.option_value_id 50 |
чтоб выглядело как на 2 скриншоте
Миниатюры
Несколько LEFT JOIN для одной и той же таблицы   Несколько LEFT JOIN для одной и той же таблицы  
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
12.11.2018, 12:30 9
Цитата Сообщение от Kifir4ik Посмотреть сообщение
А мне нужно чтобы выводило их в рядок. И не id товара 48, 46, 47, 49, 50. а другое.
у вас на скрине нет никаких 46,47,48,49,50
зачем вы их вообще указываете? там и так заджойнятся те, которые есть
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
12.11.2018, 17:50  [ТС] 10
46,47,48,49,50 это и есть id тех самых XS,S,M,L,XL
Даю скрин с базы
сори я там id товара не правильно обвел, нужно немного левее
Миниатюры
Несколько LEFT JOIN для одной и той же таблицы  
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
12.11.2018, 17:53  [ТС] 11
Вот тут видно их имина
Миниатюры
Несколько LEFT JOIN для одной и той же таблицы  
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
12.11.2018, 19:28 12
когда указывают опции конкретные (46,47,48,49) это означает, что нужно оставить товары только с этими опциями
так ведь?
где таблица связей между опциями и товарами, в которой ID опции привязывается к ID товара?
можете написать так:
SQL
1
WHERE product_id IN (SELECT product_id FROM oc_product_option_value WHERE option_value_id IN (46,47,48,49))
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
13.11.2018, 11:28  [ТС] 13
Нет я хочу вывести все.
Мне нужно видеть весь товар что есть на сайте в виде таблицы в читаемом виде со всеми ценами скидками 2 и 3 скидками и разными опциями их но чтоб каждый товар быть только в 1 строке а уже по столбикам все данные с его.

Добавлено через 4 минуты
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
    oc_product.product_id, 
    oc_product.model,
    oc_product.price,
    oc_product_special.price AS price_special,
    oc_product_option_value.quantity AS option_quantity
    FROM oc_product
    LEFT JOIN oc_product_special ON oc_product.product_id = oc_product_special.product_id
    LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id 
    WHERE product_id IN (SELECT product_id FROM oc_product_option_value WHERE option_value_id IN (48, 46, 47, 49, 50))
    ORDER BY product_id ASC
Выдает ошибку Error: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'product_id' in IN/ALL/ANY subquery is ambiguous
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
13.11.2018, 15:06 14
какие "все"?! на скрине у вас показаны исключительно 46-50
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
13.11.2018, 15:10  [ТС] 15
ну у каждого товара есть опции (обязательно к заполнению) 48, 46, 47, 49, 50
но там числа от 0 и выше а мне нужно вывести все данные с этих опций

Добавлено через 57 секунд
что насчет ошибки
Выдает ошибку Error: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'product_id' in IN/ALL/ANY subquery is ambiguous
Я что то не туда вставил?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
13.11.2018, 15:11 16
гуглите
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
13.11.2018, 15:18  [ТС] 17
Поправил product_id на oc_product.product_id
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
    oc_product.product_id,
    oc_product.model,
    oc_product.price,
    oc_product_special.price AS price_special,
    oc_product_option_value.quantity AS option_quantity
    FROM oc_product
    LEFT JOIN oc_product_special ON oc_product.product_id = oc_product_special.product_id
    LEFT JOIN oc_product_option_value  ON oc_product.product_id = oc_product_option_value.product_id 
    WHERE oc_product.product_id IN (SELECT product_id FROM oc_product_option_value WHERE option_value_id IN (48, 46, 47, 49, 50))
    ORDER BY product_id ASC
Но данные все равно выводит в рядок а не в столбик.
Миниатюры
Несколько LEFT JOIN для одной и той же таблицы  
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
13.11.2018, 15:29 18
Лучший ответ Сообщение было отмечено Kifir4ik как решение

Решение

если 46-50 это вот эти размеры XS-XL, то это называется pivot
Цитата Сообщение от полудух Посмотреть сообщение
гуглите
1
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
13.11.2018, 15:41  [ТС] 19
о что то ближе спс, пробую написать.
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 40
14.11.2018, 12:16  [ТС] 20
Сорнян, принцем вроде понял но вывести не могу.
Тебя не затруднить написать, возможно так вкурю быстрее.
0
14.11.2018, 12:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2018, 12:16
Помогаю со студенческими работами здесь

Join left
подскажите как правильно одним запросом через join left вытянуть определенные записи с разных...

LEFT JOIN Условие в ON
А можно ли какое то условие в ON написать? у меня такая проблема мне нужно сделать примерно...

Left Join если в одной из таблиц несколько значений в ячейки
Доброго времени суток. Вопрос. Есть две таблицы в каждой есть по столбцу Card_ID. Соединяем их...

Два left join к одной таблице
Добрый день. Подскажите как сюда вписать еще один join тоже к таблице users, только что бы было...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru