Выборка данных из нескольких таблиц

DrunkPacifist

Новичок
Здравствуйте.

Имеются две небольшие таблицы: `books_subcat`

и `books_cat`


Как лучше всего произвести выборку всех полей из таблицы `books_subcat`, чтобы сразу же получить соответствующее выбранной строке значение cat_name из таблицы `books_cat`, т.е books_subcat.parent_cat = books_cat.id?

То есть с помощью одного запроса сформировать список вида
экономика->макроэкономика
экономика->микроэкономика
компьютеры->программирование

Заранее благодарен!
 

DrunkPacifist

Новичок
Составил запрос вида
PHP:
SELECT * 
FROM books_cat 
INNER JOIN books_subcat ON books_subcat.parent_cat=books_cat.id
но var_dump строки результата
PHP:
$result_id = mysql_query($query, $db);

if ($result_id) {  		  	   
		if (mysql_num_rows($result_id) > 0)	{
  			while ($row = mysql_fetch_object($result_id))	{
                       ###
						var_dump($row);
                       ###      					
  			}
            ### 
}
возвращает только строки вида
object(stdClass)#2 (3) {
["id"]=>
string(1) "6"
["cat_name"]=>
string(32) "Программирование"
["parent_cat"]=>
string(1) "3"
т.е выборку только из таблицы books_subcat. Что я сделал не так?
 

KorP

Новичок
для начала надо sql запросы тестировать в sql, а не в php
 

DrunkPacifist

Новичок
1. тем не менее, правильно ли я составил запрос?
2. можно подробней насчет тестирования и почему нужно делать именно так?

Спасибо!
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
[upd]

Потому что править свои запросы в консоли mysql удобнее

Ну или в другом sql редакторе, типа mysql query browser)
 

DrunkPacifist

Новичок
Я допустил ошибку, перепутав таблицы в полях FROM и JOIN, но после исправления был неприятно удивлен тем, что совпадающие значения в обеих талицах (поле `cat_name`) перезаписываются в пользу родительской (2х'экономика' вместо 'микро-' и 'макро-'). В итоге запрос приобрел вид:
PHP:
SELECT *, 
books_subcat.cat_name AS sub 
FROM books_subcat INNER JOIN books_cat ON books_cat.id=books_subcat.parent_cat
["id"]=>
string(1) "1"
["parent_cat"]=>
string(1) "1"
["cat_name"]=>
string(22) "экономика"
["sub"]=>
string(28) "макроэкономика"
Запрос работает, но хотелось бы услышать замечания, в т.ч и насчет костылей в виде alias-а.

p.s. и да, как заставить его переписывать результаты поля cat_name в пользу дочерней таблицы books_subcat? А лучше, как сделать так, чтобы имена полей вообще не перезаписывались?
Спасибо.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
alias и все, не надо ничего "переписывать") Нормальный запрос
 

DrunkPacifist

Новичок
upd. Исправил запрос на
PHP:
SELECT 
books_subcat.id, books_subcat.cat_name, 
books_cat.cat_name AS parent 
FROM books_subcat INNER JOIN books_cat ON books_cat.id=books_subcat.parent_cat
Перезаписи нет, т.к. свел до минимума получаемые поля, исключив и заменив повторяющиеся на alias-ы, но все же хотелось бы узнать решение для случая, когда берутся все ( * ) значения
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
это решение ты его уже написал.
 

DrunkPacifist

Новичок
т.е заменять повторяющиеся поля на alias-ы? А можно как-то изменить, скажем, INNER JOIN, чтобы совпадающие поля вроде cat_name и id имели значения не из books_cat, а books_subcat?
 

SkyLine

Новичок
upd. Исправил запрос на
PHP:
SELECT 
books_subcat.id, books_subcat.cat_name, 
books_cat.cat_name AS parent 
FROM books_subcat INNER JOIN books_cat ON books_cat.id=books_subcat.parent_cat
Перезаписи нет, т.к. свел до минимума получаемые поля, исключив и заменив повторяющиеся на alias-ы, но все же хотелось бы узнать решение для случая, когда берутся все ( * ) значения

Название поля по сути переменная, поэтому и перезаписывается последним значением.
Варианта 2: либо алиас повторяющегося поля, либо получать индексный массив (mysql_fetch_row), что не всегда удобно.
Ну и чтобы записалось значение 2ой таблицы можно написать так:
PHP:
SELECT `books_cat`.*, `books_subcat`.*
FROM books_subcat 
INNER JOIN books_cat ON books_cat.id=books_subcat.parent_cat
 

DrunkPacifist

Новичок
Хм. Указать таблицы, но в нужном порядке?
Ага, работает!

Всем спасибо за помощь!
 
Сверху