Въпрос за сравняване на таблици в mysql

mvmrik

Well-Known Member
Здравейте, опитвам се да сравня две таблици в една БД и нещо не се сещам как да го направя. Идеята е да се види разликата между цената в първата и втората таблица на едни и същи продукти.

Пример:
table 1 с колони cat,product, price
table 2 с колони cat2,product2, price2

product и product2 е един и същ продукт с едно и също ID.

В момента съм го направил по този начин:
Код:
SELECT * FROM table1 as a LEFT JOIN table2 as b ON a.product = b.product2 WHERE a.product = b.product2 AND cat = 1

Сравнението работи добре и при заявката излиза цената на първия и втория продукт, след това си изкарвам всичко както трябва, но проблема е, когато в едната таблица има продукт, който не съществува в другата. Тогава той не излиза в заявката, а идеята е да излизат и тези продукти, които са само на едното място, без значение дали има само един продукт в table или един в table2.

Имате ли представа как може да се направи това с една заявка? Пробвах разни варианти и за сега не постигнах нищо.
 
LEFT OUTER JOIN, RIGHT OUTER JOIN и UNION са твоите приятели

Код:
SELECT * FROM table1
LEFT OUTER JOIN table2 ON table1.product = table2.product
UNION ALL
SELECT * FROM table1
RIGHT OUTER JOIN table2 ON table1.product = table2.product
 
Такъв пример видях и аз в интернет, но не знам защо не става. Вместо да ми извади 4 резултата, колкото трябва да са, излизат над 40. Добавях му след кода where table1 = table1.cat , опитвах се да ги групирам и пак излизат много резултати. Идеята ми е да излязат само тези, които са с cat=1 и да не се повтарят.
 
SELECT * FROM table1 as a FULL OUTER JOIN table2 as b ON a.product = b.product2 WHERE cat = 1

Така трябва да ти работи, щом си пробвал с LEFT и те устройва резултата.


Като опит може и нещо такова:

SELECT * FROM table1, table2 WHERE table1.product = table2.product2 AND cat = 1

И в селекта си сложи точно какво искаш да ти се принтне от всяка таблица.
 
SELECT * FROM table1 as a FULL OUTER JOIN table2 as b ON a.product = b.product2 WHERE cat = 1
Колегата не споменал за коя СУБД става въпрос, но предполагам, че е MySQL, който не поддържа FULL OUTER JOIN.

Такъв пример видях и аз в интернет, но не знам защо не става. Вместо да ми извади 4 резултата, колкото трябва да са, излизат над 40. Добавях му след кода where table1 = table1.cat , опитвах се да ги групирам и пак излизат много резултати. Идеята ми е да излязат само тези, които са с cat=1 и да не се повтарят.
Пробвай с DISTINCT, че в момента пиша малко наизуст.

 
Колегата не споменал за коя СУБД става въпрос, но предполагам, че е MySQL, който не поддържа FULL OUTER JOIN.

Мхм.. аз затова сложих и втора опция евентуално да си опита късмета. Иначе, това което си написал е единственото решение за Mysql.
 
Направих го с UNION ALL и проблема беше, че изкарваше всички съвпадащи резултати по 2 пъти, но другите си ги вадеше коректно. След това премахнах дубликатите с array_unique() и работи идеално. Може да има и по-елегантен вариант, но върши работа и няма да го пипам повече. Благодаря за помощта.
 

Горе