Как лучше сделать выборку из двух таблиц

Fidget

Новичок
Как лучше сделать выборку из двух таблиц

Есть две таблицы

1 табл.
id | Бренд
1 | Samsung
2 | Sony
...

2 табл.
id | Бренд_id | Модель
1 1 H45
2 2 FS4

Нужно вывести информацию из 2-й таблицы.
При выводе из столбца Бренд_id необходимо обращатся к первой таблице.

Вопрос:

Каким образом это лучше сделать...

У меня есть 2 варианта.

1. Использовать INNER JOIN.
2. Использовать двойной SQL запрос.

Какой из этих способов грамотней?
Есть ли еще какие-нибудь способы.
 

Кром

Новичок
INNER JOIN вполне подходит для твоей цели.

А что такое двойной запрос?
 

Demiurg

Guest
Сдается мне, что имеется ввиду вложеный запрос. Так вот: в mysql они пока не поддерживаются.
 

Апельсин

Оранжевое создание
Demiurg, да ему вместо бренд_ид надо подставлять название самого бренда. Тут джоина вполне хватит.
 

Fidget

Новичок
А как насчет быстродействия джоина...
Слышал что он в mysql сильно тормозит.
 

Demiurg

Guest
Апельсин, ну так на ворос кром ответил. Я просто насчет "двойного запроса" высказался.

ps "Fidget" ... хых, я уж испугался.
 

mmaaxx

Guest
Re: Как лучше сделать выборку из двух таблиц

Насколько я понял нужно вывести список моделей, с названием бренда, для этого можно:

PHP:
select табл2.id, Бренд, Модель from табл2,табл1 where Бренд_id=табл1.id
этот вариант (IMHO) mysql выполнит наиболее быстро. Но если у тебя будет ситуация, если Бренд_id небудет в табл2 (нарушена целосность данных), то эта модель выбрана не будет. Чтоб она выбиралась используй:

PHP:
SELECT табл2.id, Бренд, Модель FROM табл2 LEFT JOIN табл1 ON Бренд_id=табл1.id
Этот вариант немного медленнее (опять же IMHO).
 

Demiurg

Guest
>нарушена целосность данных
ты уверен, или просто слова эти где то слышал ?

>Этот вариант немного медленнее
как можно сравнивать скорость запросов делающие разные вещи ?
 

mmaaxx

Guest
Автор оригинала: Demiurg
ты уверен, или просто слова эти где то слышал ?
Ну точно я не могу заявлять, что при ситуации описаной выше будет нарушена целосность данных, поскольку нет детального описания таблиц. Но насколько я могу судить по семантике данных, то всёже неможет существовать модели без бренда.
как можно сравнивать скорость запросов делающие разные вещи ?
элементорно, например IMHO:
select 'max - best!'; быстрее любого insert в таблицу MyISAM, BDB или InnoDB ;))))

ну а серйозно, то я везде вставлял "IMHO", ну а сравнивал я их в одной задаче, описаной в первом посте. Единственная разница между запросаим - это то, что первый (c where) выберет из моделей только те записи, для которых есть бренд, а второй (c left join) выберет все записи из моделей, и у тех у которых небудет бренда, в полях из бренда будет стоять null.
Тоесть, если связь между этими таблицами типа "много к 1" (1 - со стороны брендов), результат выполнения запросов будет ИДЕНТИЧНЫМ.
 

Demiurg

Guest
>Но насколько я могу судить по семантике данных, то всёже неможет существовать модели без бренда.
может могут, а может и не могут, но перед тем, как давать ответ опирающийся на собственные предположения, лучше было бы уточнить это у автора вопроса.

>Единственная разница между запросаим ...
и так существование разницы в логике запросов ты не утверждаешь, но скорости продолжаешь сравнивать.
 

mmaaxx

Guest
Автор оригинала: Demiurg
и так существование разницы в логике запросов ты не утверждаешь, но скорости продолжаешь сравнивать.
Да возможно мы не поняли друг друга, я не утверждаю что кто-то медленне/быстрее ВООБЩЕ, а только для данной конкретной задачи.
 

Demiurg

Guest
>а только для данной конкретной задачи.
при этом условия задачи ты варьируешь по своему желанию. может ты все же постараешься уточнить задачу ?
 

mmaaxx

Guest
Re: Как лучше сделать выборку из двух таблиц

Fidget
Могут ли быть в таблице моделей (табл 2) записи, в которых Бренд_id является NULL ?
 

ns

Guest
Почти аналогичная проблема, только хотелось бы вывести
ВСЮ табл1 + count(Бренд1_id)

т.е. вывести всех брендов и сколько имееться товару для данного бренда
 

Falc

Новичок
SELECT brend.*, COUNT(*)
FROM BREND
JOIN tovar ON tovar.brend_id = brend.id
GROUP BY brend.id

Примерно так, правда такое работает вроде только в мускуле.
 

ns

Guest
QUOTE]Автор оригинала: Falc
SELECT brend.*, COUNT(*)
FROM BREND
JOIN tovar ON tovar.brend_id = brend.id
GROUP BY brend.id

Примерно так, правда такое работает вроде только в мускуле. [/QUOTE]
В этом случае мы получим только распечатку брендов, a COUNT будет везде=1
так как считаеться для брендов , а надо чтобы count был для товара сгрупированный по brend.id

Не обьяните почему если сделать вот такой запрос, то все поля tovar.*
равны NULL?

SELECT brend.*,tovar.*
FROM BREND
LEFT JOIN tovar ON tovar.brend_id = brend.id
GROUP BY brend.id

Получаеться что, чего я хочу можно будет сделать только в 4.1
с вложенным запросом?
 
Сверху