Задавайте вопросы, мы ответим
Вы не зашли.
подскажите у меня есть 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)
как мне объединить эти два выражения?
Неактивен
разве не рулит?:
SELECT *
FROM
obiekt
INNER JOIN men2 using(cat_men2)
INNER JOIN foto using(metka)
P.S. эх всегда мечтал писат' красиво (using)
а то все " ON artikel_id = ArticleID "
Неактивен
Спасибо рулит.
не знал о том что их можно просто так объединить!
)))))) Спасибо!!!
Неактивен
Подобный вопрос
созданы три таблицы (имя - ключ, поле)
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 строк ?
Неактивен
Не понятно, какие данные тогда выводить — ведь они могут сочетаться
в произвольных комбинациях. Именно поэтому MySQL выводит все
варианты. Кроме того, первый запрос достаточно бессмысленен, т.к.
у Вас значение поля, по которому Вы объединяете, прибито в WHERE.
Вы действительно это хотите?
Неактивен
Суть таблиц
Существует некоторая группа в таблице groups, состоящая из объектов типа poolid. В таблице ids объектов одного типа poolid может быть неколько, но каждый с уникальным номром id. Для каждой группы существует несколько точек, хранящихся в таблице points. Необходимо все объекты типа poolid разместить в точках point при заданном значении группы groupid.
В итоге должен получиться результат: id объекта, id точки.
Я понимаю, что в данном случае любой из объектов может быть размещен в любой из этих точек, именно поэтому в запрос возвращает все 100 возможных вариантов. Есть ли способ ограничить их до 10 ? Какое-нибудь условие ограничения на повторение значений в столбцах ? Еще какой-нибудь вариант ?
Отредактированно Remi (12.08.2010 18:13:17)
Неактивен
Они никогда не повторяются (можете проверить ). Придумайте на словах
способ размещения объектов — тогда его можно будет реализовать. Например,
«размещать точку с максимальным ID» — нормальный способ. Добавляете
MAX() и группировку по второму столбцу.
Неактивен
Группировка действительно уменьшает результат до 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)
Неактивен
Если Вам нужно просто объединить две выборки — объедините две выборки,
что Вам мешает?
SELECT s1.id, s1.field1, s2.field2
FROM (… запрос1 … ) s1, (… запрос2 …) s2 WHERE s1.id = s2.id.
Неактивен
Если бы все было так просто...
Попробую объяснить ситуацию еще нагляднее
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)
Неактивен
Не понимаю, какая у этого запроса может быть практическая ценность, правда
Давайте я попробую сформулировать то, как я понял постановку задачи.
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;
Неактивен
Большое спасибо за оказанну помощь. Решение действительно "костыльное". Придется собирать результат из двух отдельных запросов, чтобы в будущем не возникло вопроса, что же на самом деле возвращает эта конструкци.
Неактивен