SQL проблеми - еднакви имена на полета в множество MySQL таблици?

Имам търсене по ключови думи, което търси в множество DB таблици за миниатюрни изображения, използвайки UNION ALL. Имам две страници, results.php и view.php. Целта ми е да мога да щракна върху миниатюрно изображение на results.php и да бъда насочен към по-голяма версия на същото изображение на view.php. Проблемът е, че всяко изображение във всички мои таблици използва името на полето „id“, така че когато щракна върху миниатюра на results.php, получавам две различни изображения с еднакъв идентификатор от различни таблици. Опитах да променя идентификатора на различни имена, но когато дойде време да предам url параметри, мога да избера само 1 стойност. (ако можете да изберете повече от 1, не знам как). Така че въпросът ми е защо моите идентификатори от различни таблици са групирани заедно и как мога да променя това?

Страница с резултати от изображения (която работи перфектно):

 SELECT *
    FROM table1
    WHERE keyword LIKE %colname% OR id  LIKE %colname%  
    UNION ALL
    SELECT *
    FROM table2
    WHERE keyword LIKE %colname% OR id  LIKE %colname%  

Преглед на страницата с изображения (тук има проблеми):

SELECT *
FROM table1
WHERE id = colname
UNION ALL
FROM table2
WHERE id = colname

person Will    schedule 05.12.2011    source източник
comment
Само да отбележа, че не е добра практика да използвате * вместо именуване на всичките си колони, дори ако трябва да върнете всички колони.. :)   -  person Nonym    schedule 06.12.2011


Отговори (5)


трябва да създадете пространство от имена на имената на полетата на вашата таблица:

SELECT * FROM table1 WHERE table1.id = colname UNION ALL FROM table2 WHERE table2.id = colname
person sethvargo    schedule 05.12.2011

Добавете производно поле към двете подзаявки, за да можете да разберете от коя таблица идва този конкретен ред:

SELECT 'table1' AS source, *
FROM table1
...
UNION ALL
SELECT 'table2' AS source, *
FROM table2

след това накарайте вашия код да провери това ново поле „източник“, за да можете да посочите подходящата таблица на DB по-късно, когато дойде време за показване на това изображение.

Разбира се, ако и двете таблици имат идентична структура, това повдига въпроса защо просто не ги комбинирате в една таблица и не добавите това поле „източник“ в тази нова „глобална“ таблица, спестявайки си неприятностите да се налага да стартирате две заявки за извличане на данни за изображение.

person Marc B    schedule 05.12.2011

Не забравяйте, че можете да използвате ключовата дума AS за псевдоним на полета и таблици

SELECT *
FROM table1 as t1
WHERE t1.keyword LIKE %colname% OR t1.id  LIKE %colname%  
UNION ALL
SELECT *
FROM table2 as t2
WHERE t2.keyword LIKE %colname% OR t2.id  LIKE %colname%  
person Dan Heberden    schedule 05.12.2011
comment
Предполагам, че всички получихме -1, защото отговорихме на общия въпрос, вместо да се изказваме за дефекта в дизайна; толкова много за предоставянето на отговори/стойност на други, разглеждащи въпроси/отговори или евентуално заседнали в лошия дизайн на таблицата на някой ДРУГ, който не им е позволено да променят. - person Dan Heberden; 06.12.2011

Вашите идентификатори не се групират заедно от mysql. Просто изисквате резултатите от базата данни като асоциативни php масиви, с имената на колоните като ключове на масива. Не можете да имате дублирани ключове за масив, така че получавате само една от стойностите.

Ако не е необходимо да знаете името на таблицата, просто извлечете числово индексиран масив вместо асоциативен масив. Ако имате нужда от имената на таблиците, или променете своя sql, за да зададете псевдоними на колоните, или можете да използвате по-автоматизирани методи SQL Изберете * от множество таблици

person goat    schedule 05.12.2011

1) Ако всичките ви таблици имат една и съща структура,

това е огромен дефект в дизайна

и трябва да ги обедините в една таблица.

2) ако вашите таблици са различни и трябва да показвате само едно изображение - какъв е смисълът да използвате union на страницата за изглед? ако е само едно изображение от една таблица - защо питате 2 таблици?

person Your Common Sense    schedule 06.12.2011