SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.08.2010 17:57:57

kuzroman
Завсегдатай
Зарегистрирован: 28.04.2010
Сообщений: 37

вывод из 3х таблиц

подскажите у меня есть 3 таблицы

1- obiekt
2- men
3- foto

1я и 2я связаны полем cat_men у меня это записано так:

SELECT * FROM obiekt INNER JOIN men2 using(cat_men2) 

1я и 3я связаны полем metka или

SELECT * FROM obiekt INNER JOIN foto using(metka) 

как мне объединить эти два выражения?

Неактивен

 

#2 11.08.2010 18:10:34

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: вывод из 3х таблиц

разве не рулит?:

SELECT *
FROM
  obiekt
INNER JOIN men2 using(cat_men2)
INNER JOIN foto using(metka)

P.S. эх всегда мечтал писат' красиво (using)
а то все " ON artikel_id = ArticleID "

Неактивен

 

#3 12.08.2010 09:24:15

kuzroman
Завсегдатай
Зарегистрирован: 28.04.2010
Сообщений: 37

Re: вывод из 3х таблиц

Спасибо рулит.
не знал о том что их можно просто так объединить!
)))))) Спасибо!!!

Неактивен

 

#4 12.08.2010 16:49:46

Remi
Участник
Зарегистрирован: 12.08.2010
Сообщений: 5

Re: вывод из 3х таблиц

Подобный вопрос

созданы три таблицы (имя - ключ, поле)

groups       - groupid, poolid
points        - point,   groupid
ids            - id,   poolid

Написал два запроса

SELECT *
FROM  groups
LEFT JOIN points USING(groupid)
WHERE groups.groupid = 80

SELECT *
FROM  groups
LEFT JOIN ids USING(poolid)
WHERE groups.groupid = 80

Каждый из запросов возвращает результат из 10 строк
Объединил два запроса в один

SELECT *
FROM  groups
LEFT JOIN ids USING(poolid)
LEFT JOIN points USING(groupid)
WHERE groups.groupid = 80

Итог: результат содержит уже 100 строк, так как каждой строке результата первого запроса по очереди были прибавлены строки результата второго запроса. Необходимо просто "склеить" два результата между собой.
Как мне получить результат из 10 строк ?

Неактивен

 

#5 12.08.2010 17:54:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: вывод из 3х таблиц

Не понятно, какие данные тогда выводить — ведь они могут сочетаться
в произвольных комбинациях. Именно поэтому MySQL выводит все
варианты. Кроме того, первый запрос достаточно бессмысленен, т.к.
у Вас значение поля, по которому Вы объединяете, прибито в WHERE.
Вы действительно это хотите?

Неактивен

 

#6 12.08.2010 17:58:06

Remi
Участник
Зарегистрирован: 12.08.2010
Сообщений: 5

Re: вывод из 3х таблиц

Суть таблиц

Существует некоторая группа в таблице groups, состоящая из объектов типа poolid. В таблице ids  объектов одного типа poolid может быть неколько, но каждый с уникальным номром id. Для каждой группы существует несколько точек, хранящихся в таблице points. Необходимо все объекты типа poolid разместить в точках point при заданном значении группы groupid.

В итоге должен получиться результат:  id объекта, id точки.

Я понимаю, что в данном случае любой из объектов может быть размещен в любой из этих точек, именно поэтому в запрос возвращает все 100 возможных вариантов. Есть ли способ ограничить их до 10 ? Какое-нибудь условие ограничения на повторение значений в столбцах ? Еще какой-нибудь вариант ?

Отредактированно Remi (12.08.2010 18:13:17)

Неактивен

 

#7 12.08.2010 18:19:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: вывод из 3х таблиц

Они никогда не повторяются (можете проверить wink ). Придумайте на словах
способ размещения объектов — тогда его можно будет реализовать. Например,
«размещать точку с максимальным ID» — нормальный способ. Добавляете
MAX() и группировку по второму столбцу.

Неактивен

 

#8 12.08.2010 18:40:04

Remi
Участник
Зарегистрирован: 12.08.2010
Сообщений: 5

Re: вывод из 3х таблиц

Группировка действительно уменьшает результат до 10, но...
- группировка по объектам приводит к тому, что все 10 объектов размещены в одной точке, о остальные 9 остались свободными
- групировка по точкам приводит к тому, что все точки заняты одним объектом, а остальные 9 объектов остались без точек

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

Эта задача очень легко решается в два запроса, но очень хочется обойтись одним.

Мне просто нужен результат, состоящий из двух полей и n-ного количества строк:

id объекта, id точки

Первый столбец заполнить значениями первого запроса

SELECT id
FROM  groups
LEFT JOIN ids USING(poolid)
WHERE groups.groupid = 80

А второй столбец заполнить значениями второго запроса

SELECT poolid
FROM  groups
LEFT JOIN points USING(groupid)
WHERE groups.groupid = 80

И первый и второй столбец будут содержать уникальные значения.

Отредактированно Remi (12.08.2010 18:52:12)

Неактивен

 

#9 12.08.2010 18:51:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: вывод из 3х таблиц

Если Вам нужно просто объединить две выборки — объедините две выборки,
что Вам мешает?

SELECT s1.id, s1.field1, s2.field2
FROM (… запрос1 … ) s1, (… запрос2 …) s2 WHERE s1.id = s2.id.

Неактивен

 

#10 12.08.2010 19:32:54

Remi
Участник
Зарегистрирован: 12.08.2010
Сообщений: 5

Re: вывод из 3х таблиц

Если бы все было так просто...
Попробую объяснить ситуацию еще нагляднее

groups
-----------------
groupid,  poolid
80         10
-----------------

ids
-----------------
id,   poolid
21   10
22   10
-----------------

points
-----------------
points, groupid
100     80
101     80
-----------------

Основываясь на данных в groups я хочу получить

21  100
22  101

а получаю

21  100
21  101
22  100
22  101

То есть, первому элементу первого запроса соответствует первый элемент второго запроса, а так далее, в зависимости
от размера результатов обоих запросов. Мне хочется оба запроса объединить в один.

Неужели нет простого способа объяснить MySQL, что мне нужен результат из двух полей и нескольких строк, для каждого поля написан запрос, при этом комбинировать эти поля во всевозможных комбинациях нет необходимости. Взять один результат и "приклеить слева" второй результат.

Отредактированно Remi (12.08.2010 23:02:33)

Неактивен

 

#11 12.08.2010 23:12:54

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: вывод из 3х таблиц

Не понимаю, какая у этого запроса может быть практическая ценность, правда smile
Давайте я попробую сформулировать то, как я понял постановку задачи.

1. Есть такие запросы:
  а) SELECT ids.id FROM ids JOIN groups USING (poolid) WHERE groups.groupid = 80;
  б) SELECT points.points FROM points WHERE groupid = 80;
2. Хочется сделать выборку, которая бы содержала первым столбцом первый запрос,
а вторым столбцом — второй запрос.

Если задача именно такая, то решения в лоб для нее я не вижу. Могу предложить
какое-то костыльное решение такого вида:

SELECT a.id, b.points
FROM
(SELECT @a := @a + 1 AS c, ids.id AS id FROM ids JOIN groups USING (poolid) WHERE groups.groupid = 80) a,
(SELECT @b := @b + 1 AS c, points.points FROM points WHERE groupid = 80) b
WHERE a.c = b.c;

Перед каждым повторением внутри одного и того же соединения нужно
переинициализировать @a и @b (по крайней мере требуется, чтобы они
были равны между собой): SET @a := 0;

Неактивен

 

#12 12.08.2010 23:33:38

Remi
Участник
Зарегистрирован: 12.08.2010
Сообщений: 5

Re: вывод из 3х таблиц

Большое спасибо за оказанну помощь. Решение действительно "костыльное". Придется собирать результат из двух отдельных запросов, чтобы в будущем не возникло вопроса, что же на самом деле возвращает эта конструкци.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson