Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: выбрать строки с 'id(IN) без потери существующих
 
 автор: sl1p   (13.01.2010 в 09:18)   письмо автору
 
 

Имеется поле в котором хранятся `id` таблицы в виде : 1^5^2^7
Как выбрать всё из таблицы не теряя всех строк если, например, id#5 не существует?

В данный момент делаю:
"SELECT .... WHERE `id` IN(".implode(","explode("^","$ids)).")"
но этот способ мне не подходит..

Очень радует LEFT JOIN но как его здесь можно применить и можно ли вообще..

  Ответить  
 
 автор: kosta_in_net   (13.01.2010 в 11:38)   письмо автору
 
   для: sl1p   (13.01.2010 в 09:18)
 

не знаю, чем не подходит IN, но ели не подходит, можно передать в селект строку, где знак крышки заменен на OR id=
Тогда получится:
"SELECT .... WHERE id= $var
где $var="1OR id=5 OR id=2 OR id=7"

  Ответить  
 
 автор: Trianon   (13.01.2010 в 12:02)   письмо автору
 
   для: sl1p   (13.01.2010 в 09:18)
 

таблица не находится даже в первой нормальной форме.
Поэтому о LEFT JOIN говорить не приходится.

Не хранят в полях цепочки ключей!

  Ответить  
 
 автор: kosta_in_net   (13.01.2010 в 12:12)   письмо автору
 
   для: Trianon   (13.01.2010 в 12:02)
 

не уверен, что это 1^5^2^7 хранится именно в таблице. Если же в таблице... то... нет слов...

  Ответить  
 
 автор: Trianon   (13.01.2010 в 13:03)   письмо автору
 
   для: kosta_in_net   (13.01.2010 в 12:12)
 

>не уверен, что это 1^5^2^7 хранится именно в таблице.

Не уверены.

> автор: sl1p (13.01.2010 в 09:18) письмо автору
> Имеется поле в котором хранятся `id` таблицы в виде : 1^5^2^7

Эти слова можно интерпретировать двояко?
Поле (в контексте SQL-раздела) можно отнести к чему-то другому?

>Если же в таблице... то... нет слов...

И у меня нет слов. Вот только по другому поводу.
Перед тем, как отвечать на сообщение, его прочесть нужно!

  Ответить  
 
 автор: kosta_in_net   (13.01.2010 в 13:09)   письмо автору
 
   для: Trianon   (13.01.2010 в 13:03)
 

Дык я и прочел. Если что-то не правильно понял, прошу не наезжать. Вот, что и как я понял:
"SELECT .... WHERE `id` IN(".implode(","explode("^","$ids)).")"
implode(","explode("^","$ids)) - это операции явно из ПХП. Таким образом в SQL запрос приходит как:
"SELECT .... WHERE `id` IN(1,5,2,7)"
То есть: выбрать данные, поля id которых содержит одно из значений... То есть, поле не содержит 1^5^2^7. Оно содердит нормальные числа...
Я так понял.

  Ответить  
 
 автор: sl1p   (13.01.2010 в 13:17)   письмо автору
 
   для: Trianon   (13.01.2010 в 12:02)
 

ммм причём здесь таблица я не понял чуть-чуть :)

объясню мою логику:

Пользователь делает заказ на товар, есть специальная таблица с нужными данными имя айди товара и так далее..
К товару прилагаются дополнительные услуги.
И эти услуги я засовую в поле services таким образом.

Создавать отдельную таблицу для одного поля?.. кхе..

Либо я что-то упустил в своей "логике" либо Вы меня не так поняли :)

А о LEFT JOIN я имел ввиду, что если значения нет оно просто приходит пустым.
И в данной ситуации мне нужно сделать так, чтобы если услуга была удалена и невозможен её поиск то просто игнорировать это и продолжать выбирать существующие услуги.

Тобишь здесь большн всего подойдёт "OR" ?

  Ответить  
 
 автор: kosta_in_net   (13.01.2010 в 13:26)   письмо автору
 
   для: sl1p   (13.01.2010 в 13:17)
 

реально, увидить бы тут структуру базы (можно в упрощенной форме) и пример данных, пришедших из формы с пояснениями, чего именно может не быть (я так понял, из формы может прийти номер (id) услуги, которой больше нет). Ситуация прояснилась бы.

  Ответить  
 
 автор: Trianon   (13.01.2010 в 13:47)   письмо автору
 
   для: sl1p   (13.01.2010 в 13:17)
 

>И эти услуги я засовую в поле services таким образом.

В поле таблицы SQL не помещают массивы данных.
Помещают только одиночные (атомарные) значения.
Если необходимо описать связь между многими (заказами) и многими (товарами, услугами), применяется связь многие-ко-многим (N:N). Реализуется она отдельной (одной) таблицей.
К примеру, реализация покупательской корзины может быть такой:
(order_id, good_id, qty)
   1,         777,    2
   1,           5,    3
   2,           5,   10

в данном случае заказ 1 состоит из 2 штук товара 777 и 3 штук товара 5,
а заказ 2 состоит из 10 штук товара 5.
В таблицах заказа никаких упоминаний товара нет вообще.

А дальше в гугл - искать про связь многие ко многим.

  Ответить  
 
 автор: sl1p   (13.01.2010 в 14:47)   письмо автору
 
   для: Trianon   (13.01.2010 в 13:47)
 

это понятно, я так и делаю всегда, но здесь просто, как мне кажется, будет лишним создавать ещё одну таблицу..
Просто по полю service нету ни поиска, ни условий, ничего.
Это лишь для админки увидеть что там в дополнении к товару.


Но если надо так надо.. Спасибо :)

  Ответить  
 
 автор: Trianon   (13.01.2010 в 14:56)   письмо автору
 
   для: sl1p   (13.01.2010 в 14:47)
 

Вы уже дали понять, что поиск по полю у Вас есть.

Но даже если нету.
Понимаете, это как шуруп отверткой завернуть, а не молотком заколотить.
Если даже Вы не собираетесь вешать на него тяжесть.
Просто после того, как Вы двадцать раз откажетесь от молотка в пользу отвертки, у Вас выработается привычка.

А ненормализованная таблица видна куда явственнее, нежели забитый шуруп.

  Ответить  
 
 автор: sl1p   (13.01.2010 в 23:37)   письмо автору
 
   для: Trianon   (13.01.2010 в 14:56)
 

или я совсем туп или х3...:((
Вашу мыслья понял, и полностью с ней согласен во многих случаях... Но поиска тут действительно нету..

в таблице `reserve` поле `services` с таким кривым массивом.
ну и далее из таблицы `services` уже вытягивается нужное..

Как оно может некорректно повлиять на работу не пойму..

  Ответить  
 
 автор: Trianon   (13.01.2010 в 23:46)   письмо автору
 
   для: sl1p   (13.01.2010 в 23:37)
 

SELECT r.* FROM 
   reserve r JOIN reserved_services rs ON r.id = rs.reserve_id 
   WHERE rs.service_id  = $service
   GROUP BY r.id


несколько грязно, но фактически работоспособно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования