[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить запрос
Mirexzpalich
В общем, т.к. я не особо дружу с SQL то одна, наверняка небольшая задачка поставила меня в тупик.
Есть 3 таблицы:

DATA_TEST
id|type_test|id_test|date|
1----exam-----2------03
2-----rgr-------14-----17

EXAM
id|text
2---hello!

RGR
id | text
14--ya!


Как наверняка вы уже поняли в DATA_TEST.type_test храниться название таблицы. А в DATA_TEST.id_test соответственно id записи из таблицы название которой храниться в DATA_TEST.type_test

Необходимо ОДНИМ запросом выдернуть все данные о тестах.
Бью в колокол!!!!
Пока что быстренько организовал это дело несколькими запросами... Вы уже сами догадались как...



Спустя 3 минуты, 37 секунд (2.06.2011 - 21:23) Dezigo написал(а):
Использую SQL JOIN
http://www.w3schools.com/sql/sql_join.asp

Спустя 5 минут, 48 секунд (2.06.2011 - 21:29) Mirexzpalich написал(а):
Dezigo
Спасибо.
Согласен, повторение - мать учения. Но как я подключу необходимую мне таблицу для выдергивания TEXT? Подключать сразу все? Тогда что произойдет, если id таблиц совпадут? что у меня будет в ответе? Нет, конешно можно прописать ВСЕМ АЛЯСЫ и разбирать полученный массив, ставя условая, но это не то что нужно.
Если я ошибаюсь, поправьте....

Спустя 10 секунд (2.06.2011 - 21:29) sharki написал(а):
Mirexzpalich
А типы тестов могут дополняться (новые таблицы)? или они статические? И ты хочешь вытащить все данные о типах которые описываются в DATA_TEST, причем связывать их надо не по ID а именно по названиям?

Если типы(таблицы) динамические, то нарушена вторая норма.

Спустя 3 минуты, 51 секунда (2.06.2011 - 21:33) Mirexzpalich написал(а):
sharki
Сами таблицы - динамические, в них могут добавляться и удалятся записи.
поле DATA_TEST.type_test всегда имеет значение-название существующей таблицы. А DATA_TEST.id_test всегда имеет значение одного из id этой таблицы

Спустя 9 минут, 34 секунды (2.06.2011 - 21:43) sharki написал(а):
SELECT 
t1.`text` AS `txt1` , t2.`text` AS `txt2`
FROM
`exam` AS t1
LEFT JOIN
`rgr` AS t2
ON t2.`id` IN (SELECT `id`
FROM `DATA_TEST`
WHERE `type_test` = 'exam' )
WHERE
t1.`id` IN (SELECT `id`
FROM `DATA_TEST`
WHERE `type_test` = 'rgr')

Спустя 17 минут, 43 секунды (2.06.2011 - 22:00) Mirexzpalich написал(а):
sharki
Спасибо =) Это уже ближе к правде.
Но вот в чем беда... запрос возвращает строки, в котоых есть инфа о `exam` и `rgr` одновременно.
`txt1`| `txt2`
hello!---------ya!



Мне же нужно получить что-то типа:

type_test | id | text | date
exam-------2---- hello!--03
rgr----------14---- ya!---17

Спустя 5 минут, 59 секунд (2.06.2011 - 22:06) sharki написал(а):
Ну как объединять ты увидел, попробуй сам объединить, только щас у тебя получится 2 LEFT JOIN

Если не получится, поможем

Спустя 10 минут, 29 секунд (2.06.2011 - 22:17) Mirexzpalich написал(а):
Хорошо. Приведу свое решение. Мэби, уто ускорит дело =)

//Получаю массив названий таблиц
$sql = 'SELECT `type_test` FROM `date_test`';
$type_test = sqlArray($DB->query($sql));
//убираю повторения
$type_test = array_unique($type);
$row = array();
foreach($type_test as $value)
{
$sql = 'SELECT D.`type_test`, T.`id`, T.`text`, D.`date`
FROM `date_test` as D
LEFT JOIN `'
.$value.'` as T ON(T.`id` = D.`id_test`)';

$row +=sqlArray($DB->query($sql));
}
Получаю, то что мне нужно:
type_test | id | text | date
exam-------2---- hello!--03
rgr----------14---- ya!---17

Как видим - 2 запроса. (но если добавлять таблицы, а это вполне реально то количество запросов возрастет на количество добаленных таблиц)
И все бы ничего, но если я захочу все это дело упорядочить по date? Перебирать массивчег мне не хочется. надо сделать 1м SQL запросом.

Спустя 9 минут, 16 секунд (2.06.2011 - 22:26) sharki написал(а):
SELECT 
t1.`type_test` ,
t1.`id_test` ,
t1.`date` ,
t2.`text` AS `exam_text` ,
t3.`text` AS `rgr_text`
FROM
`DATA_TEST` AS t1
LEFT JOIN
`exam` AS t2 ON t1.`id_test` = t2.`id`
LEFT JOIN
`rgr` AS t3 ON t1.`id_test` = t3.`id`

Спустя 22 минуты, 16 секунд (2.06.2011 - 22:48) Mirexzpalich написал(а):
sharki
Огромнейшее спасибо!!! Благодаря тебе добил =)

Dezigo
Тоже + в карму. =)


_____________
Дорогу осилит идущий...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.