[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Непростой вывод данных из sql
walters
Есть запрос данных который обрабатываю через 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
кроме как создать хранимку для этого больше че-то мыслей не приходит. пользовательская переменная в лимите не сработает (был такой вариант).
walters
redreem какие варианты по реализации ?
sg.com
Цитата (walters @ 29.04.2016 - 16:05)
моя задача при выводе первых данных из базы с именами, присвоить поочередно свободный id из второй таблицы (проверять по zaniato)

правильно ли вопрос поставлен? Название темы сложный вопрос sql, а задача - "при выводе".
redreem
Цитата (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
redreem спасибо это работает, но я думал как то на основе цикла это сделать, ибо возможно что там мест во второй таблице не будет для столько строк сколько есть в первой
redreem
Цитата (walters @ 29.04.2016 - 18:12)
redreem спасибо это работает, но я думал как то на основе цикла это сделать, ибо возможно что там мест во второй таблице не будет для столько строк сколько есть в первой

в цикле еще проще. писать лень уже. запрос было интересно собрать, а в цикле - элементарная логика.
walters
redreem
а как в запросе аргументировать значения set @a = 0;set @b = 0;
redreem
Цитата (walters @ 29.04.2016 - 18:20)
redreem
а как в запросе аргументировать значения set @a = 0;set @b = 0;

в смысле?
если запрос не проходит из пыха - можно просто убрать эти иницализации. оставить селект. нули по умолчанию присвоятся переменным.
walters
redreem
странно даже SELECT без сетов не работает даже в SQL тестере
walters
Подскажите пожалуйста как реализовать это с помощю масива
redreem
погугли на предмет версий. у меня работает возможно потому, что версия свежее и поддерживает этот момент.

Цитата (walters @ 29.04.2016 - 18:12)
возможно что там мест во второй таблице не будет для столько строк сколько есть в первой


сделай вместо join, left join и если места не хватит, то вернется null в последнем столбце. или можно придумать что-то еще если нужно вместо нул.
так или иначе, если вопрос решается запросом, нет смысла городить циклы.
walters
redreem с SET-ом разобрался, но проблема в твоем ответе последнем, сейчас проверю left join
redreem
Цитата (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
вообще, мне кажется, когда возникают такие задачи, то проблема в архитектуре БД. что-то там неверно спроектировано. ибо при верном проектировании все запросы получаются красивые и очевидные. а тут явно костыли надо городить.
Быстрый ответ:

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