Вложенный SELECT

Vampire

Новичок
Вложенный SELECT

никак не могу реализовать вложенный select по двум таблицам:
Таблица2 содержит записи с кодом из Таблицы1. Необходимо Создать объединение Таблицы1 и _последней_ записи соответсвующей коду из Таблицы2.
Должно быть что-то вроде:
SELECT Table1.*,TableX.* FROM Table1,(SELECT * FROM Table2 WHERE Table2.code=Table1.id ORDER BY Table2.id DESC LIMIT 1) AS TableX;
Ругается что Table1.id во вложенном селекте не известно.
Как решить эту задачу одним селектом?
 

Solid

Drosera anglica
Vampire
Вы путаете выборку и определение таблиц. Блок вложенного select'a перекиньте перед FROM, всё и заработает...
 

Vampire

Новичок
В принципе заработало (спасибо)
но в случае, когда во вложенном select пустой результат,
то:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Как с этим бороться?
 

alpine

Новичок
Как вариант вот этот подзапрос:
[sql]
SELECT * FROM Table2 WHERE Table2.code=Table1.id ORDER BY Table2.id DESC LIMIT 1
[/sql]
заменить на такой:
[sql]
SELECT * FROM Table2 t1
WHERE t1.id=(SELECT MAX(t2.id)
FROM Table2 t2
WHERE t1.id = t2.id);
[/sql]
 

Vampire

Новичок
Solid
кроме того, если во вложенном запросе более одного поля , то:
Operand should contain 1 column(s)

alpine
ваще - караул
 

Solid

Drosera anglica
Vampire
А какая задача, т.е. для чего это надо? Может быть, подскажу более лучшее решение.
 

Vampire

Новичок
Solid
Таблица "Клиент" с полями характеризующими клиента
Таблица "Операции (действия) клиента со своими полями"
В Таблице "Операции" актуальной записью для клиента считается - последняя.
необходимо вывести клиентов и детали их последних операций в таблицу, причем на этот вывод может быть наложен фильтр, как по клиенту, так и по операции.
Не хотелось бы делать два селекта (как есть в данный момент)
Хотелось бы за один запрос получить необходимую информацию

-~{}~ 20.12.06 19:19:

Огромный респект alpine за идею!
Огромный респект solid за участие!
Решилось:
SELECT *
FROM `Table1` t1
JOIN `Table2` t2 ON t2.Client = t1.ID
WHERE t1.ID =56
AND t2.ID = (
SELECT MAX( `ID` )
FROM `History` t3
WHERE t3.Client = t1.ID )
 

Solid

Drosera anglica
Vampire
Намного ли быстрее работает этот запрос, в отличии от реализации "2-х запросов"?
 

Vampire

Новичок
да... скорость такая же...
плюсы - можно отфильтровать за один запрос
минусы - если во второй таблице нет соответсвий, то с первой отображает не все записи (что и логично)
так что оставил все по старому: два отедльных запроса - один в цикле другого...
ну что ж... Попытка - не пытка :)
 

Vallar_ultra

Любитель выпить :)
"то с первой отображает не все записи" - А если использовать LEFT JOIN
 

Solid

Drosera anglica
И всё же, было бы очень интересно увидеть решение с помощью одного запроса.
 

Vallar_ultra

Любитель выпить :)
Вроде так:
[sql]
SELECT *
FROM `Table1` t1
LEFT JOIN `Table2` t2 ON t2.Client = t1.ID
WHERE t1.ID =56
AND t2.ID = (
SELECT MAX( `ID` )
FROM `History` t3
WHERE t3.Client = t1.ID )
[/sql]
 

chira

Новичок
Vallar_ultra
если с LEFT JOIN то логичней IMHO так:
Код:
SELECT *
FROM `Table1` t1
LEFT JOIN `Table2` t2 ON t2.Client = t1.ID AND t2.ID = (
  SELECT MAX( `ID` )
  FROM `History` t3
  WHERE t3.Client = t1.ID ) 
WHERE t1.ID = 56
 

Lutsk

Новичок
Мне наверное сюда.
PHP:
SELECT suggestions.*,
    (SELECT * FROM img_files WHERE img_files.user_id = suggestions.user_login) AS files
  FROM suggestions
  WHERE `suggestions`.`project` = '111111116'
Выдаёт "Operand should contain 1 column(s)". Мануал помог. Что не так в запросе?
 

Gas

может по одной?
подзапрос должен вернуть одну колонку, а не *
 

Lutsk

Новичок
Я решил вложеным foreach обойтись. Не силён в тонкостях SQL просто. Дело в том, что такая структура массива в итоге должна получиться:
PHP:
Array
(
	[0] => Array
		(
			[suggestion_id] => 1
			[project] => 1
			[user_login] => vova
			[files] => Array
				(
					[0] => Array
						(
							[file_name] => aaa.jpg
							[file_ext] => .jpg
						)

					[1] => Array
						(
							[file_name] => bbb.jpg
							[file_ext] => .jpg
						)
				)
		)

    [1] => Array
        (
			[suggestion_id] => 2
			[project] => 1
			[user_login] => petya
			[files] => Array
				(
					[0] => Array
						(
							[file_name] => ccc.jpg
							[file_ext] => .jpg
						)

					[1] => Array
						(
							[file_name] => ddd.jpg
							[file_ext] => .jpg
						)
				)
		)
)
 

Gas

может по одной?
Если вложеным foreach
если ты сначала получаешь пользователей, а потом в foreach для каждого делаешь sql запрос на получение файлов - никуда не годится.
подзапросом тоже не получить той структуры как ты хочешь.
Нужно сделать один sql запрос с джойном между suggestions и img_files, а в foreach'е уже сформировать массив нужной тебе структуры.
 

Lutsk

Новичок
Все равно с запросом не получается.
Вот, к примеру, расширенно моя задача:

Есть таблица "suggestions":

-------------------------------------
suggestion_id | name | project_author
-------------------------------------
1 | aaa | Vasya
-------------------------------------
2 | ccc | petya
-------------------------------------
3 | bbb | Vasya
---------- --------------------------
4 | eee | Vasya
-------------------------------------
5 | ddd | petya
-------------------------------------

и есть таблица "files":

------------------------------
id_file | file_name | suggestion
------------------------------
1 | aaaaa.jpg | 3
------------------------------
2 | bbbbb.jpg | 2
------------------------------
3 | ccccc.jpg | 1
------------------------------
4 | ddddd.jpg | 2
------------------------------
5 | eeeee.jpg | 4
------------------------------
6 | ggggg.jpg | 3
------------------------------
7 | kkkkk.jpg | 5
------------------------------
8 | mmmь.jpg | 2
------------------------------
9 | ooooo.jpg | 1
------------------------------
10 | ppppp.jpg | 4
------------------------------

Как составить запрос, чтоб в итоге получилась структура массива:

PHP:
Vasya_files = array(
	[0] => aaa = array(
		[0] => ccccc.jpg
		[1] => ooooo.jpg
	)
	[1] => bbb = array(
		[0] => aaaaa.jpg
		[1] => ggggg.jpg
	)
	[2] => eee = array(
		[0] => eeeee.jpg
		[1] => ppppp.jpg
	)
)
Другими словами, вытащить все "file_name", принадлежащие "suggestions", которые в свою очередь пренадлежат "Vasya"?
 

Gas

может по одной?
Как составить запрос, чтоб в итоге получилась структура массива
никак такой запрос не составить.
составь запрос, который получит все suggest и файлы (да, c избыточностью) и в foreach'е сформируй массив нужной структуры.
 
Сверху