Проблемы SQL - одинаковые имена полей в нескольких таблицах MySQL?

У меня есть поиск по ключевым словам, который ищет миниатюрные изображения в нескольких таблицах БД с помощью UNION ALL. У меня есть две страницы: results.php и view.php. Моя цель - щелкнуть миниатюрное изображение на results.php и перейти к более крупной версии того же изображения на view.php. Проблема в том, что каждое изображение во всех моих таблицах использует имя поля «id», поэтому, когда я нажимаю эскиз на results.php, я получаю два разных изображения с одинаковым идентификатором из разных таблиц. Я попытался изменить идентификатор на другие имена, но когда пришло время передавать параметры URL, я могу выбрать только одно значение. (если вы можете выбрать больше 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

затем попросите ваш код проверить это новое поле «источник», чтобы вы могли указать на соответствующую таблицу БД позже, когда придет время отображать это изображение.

Конечно, если обе таблицы имеют идентичную структуру, возникает вопрос, почему вы просто не объединили их в одну таблицу и не добавили это поле «источник» в эту новую «глобальную» таблицу, избавив от необходимости запускать два запроса для получения данных изображения.

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 Select * из нескольких таблиц

person goat    schedule 05.12.2011

1) Если все ваши таблицы имеют одинаковую структуру,

это огромный недостаток дизайна

и вы должны объединить их в одну таблицу.

2) если у вас разные таблицы и вам нужно показать только одно изображение - какой смысл использовать объединение на странице просмотра? если это всего лишь одно изображение из одной таблицы - зачем вы запрашиваете 2 таблицы?

person Your Common Sense    schedule 06.12.2011