URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7737
[ Назад ]

Исходное сообщение
"Mysqljoin"

Отправлено reverb , 07-Июн-13 20:35 
Имеются 2 таблицы. Делаем выборку * собъединением

mysql> SELECT * FROM nomenclature INNER JOIN description;
+----+-----------+----+---------------------+
| id | name      | id | description         |
+----+-----------+----+---------------------+
|  1 | Книга     |  1 | Замечательная книга |
|  2 | Табуретка |  1 | Замечательная книга |
|  3 | Карандаш  |  1 | Замечательная книга |
|  1 | Книга     |  3 | Красный карандаш    |
|  2 | Табуретка |  3 | Красный карандаш    |
|  3 | Карандаш  |  3 | Красный карандаш    |
|  1 | Книга     |  5 | Зелёная машинка     |
|  2 | Табуретка |  5 | Зелёная машинка     |
|  3 | Карандаш  |  5 | Зелёная машинка     |
+----+-----------+----+---------------------+
9 rows in set (0.00 sec)

Но вот как быть если надо выбрать SELECT id,name,description FROM nomenclature INNER JOIN description;

Mysql ругается на ERROR 1052 (23000): Column 'id' in field list is ambiguous

Как побороть?


Содержание

Сообщения в этом обсуждении
"Mysqljoin"
Отправлено reverb , 07-Июн-13 22:11 
>[оверквотинг удален]
>    |
> |  3 | Карандаш  |  5 | Зелёная машинка
>     |
> +----+-----------+----+---------------------+
> 9 rows in set (0.00 sec)
> Но вот как быть если надо выбрать SELECT id,name,description FROM nomenclature INNER
> JOIN description;
> Mysql ругается на ERROR 1052 (23000): Column 'id' in field list is
> ambiguous
> Как побороть?

Ээх, ну указал с какой таблицы id :)
Вопрос снят.


"Mysqljoin"
Отправлено DeadLoco , 10-Июн-13 14:31 
> Ээх, ну указал с какой таблицы id :)

На будущее: крайне настоятельно рекомендуется в любых запросах алиасить имена таблиц, даже если она одна.

SELECT w.*
FROM table AS w
WHERE w.key = blabla
ORDER BY w.value ASC;

SELECT w.value
FROM table1 AS w
JOIN table2 AS z ON z.id = w.zid
WHERE w.key = blabla
  AND z.key = foofoo
ORDER BY w.value ASC;


"Mysqljoin"
Отправлено reverb , 10-Июн-13 20:08 
>[оверквотинг удален]
>
SELECT w.* 
> FROM table AS w
> WHERE w.key = blabla
> ORDER BY w.value ASC;
> SELECT w.value
> FROM table1 AS w
> JOIN table2 AS z ON z.id = w.zid
> WHERE w.key = blabla
>   AND z.key = foofoo
> ORDER BY w.value ASC;
 

Почему так? С точки зрения производительности?


"Mysqljoin"
Отправлено DeadLoco , 10-Июн-13 20:50 
> Почему так? С точки зрения производительности?

С точки зрения разработки и поддержания кода. Если вы в будущем захотите заменить одну таблицу на другую, с дополненной и исправленной структурой, то менять придется одну строку в каждом запросе, а не все, где упоминается оригинальное имя таблицы. Сравните:


SELECT w.id, w.name, z.title AS job_title, s.title AS tool_title
   FROM users AS w
   JOIN jobs  AS z ON z.id = w.job_id
   JOIN tools AS s ON s.id = z.tool.id
   WHERE s.id = somevalue
     AND w.id IN (1,3,5,7)
   ORDER BY w.id, z.id, s.id;
и

SELECT users.id, users.name, jobs.title AS job_title, tools.title AS tool_title
   FROM users
   JOIN jobs  ON jobs.id = users.job_id
   JOIN tools ON tools.id = jobs.tool_id
   WHERE tools.id = somevalue
     AND users.id IN (1,3,5,7)
   ORDER BY users.id, jobs.id, tools.id;