walters
29.04.2016 - 16:05
Есть запрос данных который обрабатываю через while
$res = mysqlQuery("SELECT * FROM `items`");
while($row = mysql_fetch_assoc($res))
{
echo $row['id'].' '.$row['name'];
}
в итоге я получаю список вида
1 vasia
2 fedea
3 anton
теперь вопрос:есть вторая таблица
table2
со струкруторй
id - book - zaniato
1 - odin - 0
2 - dva - 0
3 - tri - 1
4 - chetire - 1
5 - piati - 0
моя задача при выводе первых данных из базы с именами, присвоить поочередно свободный id из второй таблицы (проверять по zaniato)
в конце у меня должно выйти
id | name | id iz table 2 в зависимости если (занято = 0)
1 vasia 1
2 fedea 2
3 anton 5
redreem
29.04.2016 - 16:40
кроме как создать хранимку для этого больше че-то мыслей не приходит. пользовательская переменная в лимите не сработает (был такой вариант).
walters
29.04.2016 - 16:54
redreem какие варианты по реализации ?
sg.com
29.04.2016 - 16:55
Цитата (walters @ 29.04.2016 - 16:05) |
моя задача при выводе первых данных из базы с именами, присвоить поочередно свободный id из второй таблицы (проверять по zaniato) |
правильно ли вопрос поставлен? Название темы сложный вопрос sql, а задача - "при выводе".
redreem
29.04.2016 - 17:01
Цитата (walters @ 29.04.2016 - 17:54) |
redreem какие варианты по реализации ?
|
а вот вроде работает так:
set @a = 0;
set @b = 0;
select
ii.id,
ii.name,
t2.td_t2
from (
select
i.id,
i.name,
@a:=@a+1 a
from items i
) ii
join (select id td_t2, @b:=@b+1 num from table2 t where t.zaniato = 0 order by t.id) t2 on t2.num = ii.a
какие варианты по реализации??? ну написать хранимку, которая будет делать выборку и отдавать результат
walters
29.04.2016 - 17:12
redreem спасибо это работает, но я думал как то на основе цикла это сделать, ибо возможно что там мест во второй таблице не будет для столько строк сколько есть в первой
redreem
29.04.2016 - 17:14
Цитата (walters @ 29.04.2016 - 18:12) |
redreem спасибо это работает, но я думал как то на основе цикла это сделать, ибо возможно что там мест во второй таблице не будет для столько строк сколько есть в первой |
в цикле еще проще. писать лень уже. запрос было интересно собрать, а в цикле - элементарная логика.
walters
29.04.2016 - 17:20
redreem
а как в запросе аргументировать значения set @a = 0;set @b = 0;
redreem
29.04.2016 - 17:22
Цитата (walters @ 29.04.2016 - 18:20) |
redreem а как в запросе аргументировать значения set @a = 0;set @b = 0; |
в смысле?
если запрос не проходит из пыха - можно просто убрать эти иницализации. оставить селект. нули по умолчанию присвоятся переменным.
walters
29.04.2016 - 17:29
redreem
странно даже SELECT без сетов не работает даже в SQL тестере
walters
29.04.2016 - 18:22
Подскажите пожалуйста как реализовать это с помощю масива
redreem
29.04.2016 - 18:22
погугли на предмет версий. у меня работает возможно потому, что версия свежее и поддерживает этот момент.
Цитата (walters @ 29.04.2016 - 18:12) |
возможно что там мест во второй таблице не будет для столько строк сколько есть в первой |
сделай вместо join, left join и если места не хватит, то вернется null в последнем столбце. или можно придумать что-то еще если нужно вместо нул.
так или иначе, если вопрос решается запросом, нет смысла городить циклы.
walters
29.04.2016 - 18:26
redreem с SET-ом разобрался, но проблема в твоем ответе последнем, сейчас проверю left join
redreem
29.04.2016 - 18:27
Цитата (walters @ 29.04.2016 - 19:22) |
Подскажите пожалуйста как реализовать это с помощю масива |
1. select table2, где занято = 0
2. поместить всю выборку в массив. например t2_arr
3. завести счетчик использованных записей из table2, например t2_cntr = 0;
4. при выгребании в цикле из item брать значение из t2_arr[t2_cntr++]['id']
всё.
если сложности с программированием, могу за 300 сделать.
redreem
29.04.2016 - 18:31
вообще, мне кажется, когда возникают такие задачи, то проблема в архитектуре БД. что-то там неверно спроектировано. ибо при верном проектировании все запросы получаются красивые и очевидные. а тут явно костыли надо городить.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.