|
|
|
| Имеется поле в котором хранятся `id` таблицы в виде : 1^5^2^7
Как выбрать всё из таблицы не теряя всех строк если, например, id#5 не существует?
В данный момент делаю:
"SELECT .... WHERE `id` IN(".implode(","explode("^","$ids)).")"
но этот способ мне не подходит..
Очень радует LEFT JOIN но как его здесь можно применить и можно ли вообще.. | |
|
|
|
|
|
|
|
для: sl1p
(13.01.2010 в 09:18)
| | не знаю, чем не подходит IN, но ели не подходит, можно передать в селект строку, где знак крышки заменен на OR id=
Тогда получится:
"SELECT .... WHERE id= $var
где $var="1OR id=5 OR id=2 OR id=7" | |
|
|
|
|
|
|
|
для: sl1p
(13.01.2010 в 09:18)
| | таблица не находится даже в первой нормальной форме.
Поэтому о LEFT JOIN говорить не приходится.
Не хранят в полях цепочки ключей! | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 12:02)
| | не уверен, что это 1^5^2^7 хранится именно в таблице. Если же в таблице... то... нет слов... | |
|
|
|
|
|
|
|
для: kosta_in_net
(13.01.2010 в 12:12)
| | >не уверен, что это 1^5^2^7 хранится именно в таблице.
Не уверены.
> автор: sl1p (13.01.2010 в 09:18) письмо автору
> Имеется поле в котором хранятся `id` таблицы в виде : 1^5^2^7
Эти слова можно интерпретировать двояко?
Поле (в контексте SQL-раздела) можно отнести к чему-то другому?
>Если же в таблице... то... нет слов...
И у меня нет слов. Вот только по другому поводу.
Перед тем, как отвечать на сообщение, его прочесть нужно! | |
|
|
|
|
|
|
|
для: 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. Оно содердит нормальные числа...
Я так понял. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 12:02)
| | ммм причём здесь таблица я не понял чуть-чуть :)
объясню мою логику:
Пользователь делает заказ на товар, есть специальная таблица с нужными данными имя айди товара и так далее..
К товару прилагаются дополнительные услуги.
И эти услуги я засовую в поле services таким образом.
Создавать отдельную таблицу для одного поля?.. кхе..
Либо я что-то упустил в своей "логике" либо Вы меня не так поняли :)
А о LEFT JOIN я имел ввиду, что если значения нет оно просто приходит пустым.
И в данной ситуации мне нужно сделать так, чтобы если услуга была удалена и невозможен её поиск то просто игнорировать это и продолжать выбирать существующие услуги.
Тобишь здесь большн всего подойдёт "OR" ? | |
|
|
|
|
|
|
|
для: sl1p
(13.01.2010 в 13:17)
| | реально, увидить бы тут структуру базы (можно в упрощенной форме) и пример данных, пришедших из формы с пояснениями, чего именно может не быть (я так понял, из формы может прийти номер (id) услуги, которой больше нет). Ситуация прояснилась бы. | |
|
|
|
|
|
|
|
для: 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.
В таблицах заказа никаких упоминаний товара нет вообще.
А дальше в гугл - искать про связь многие ко многим. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 13:47)
| | это понятно, я так и делаю всегда, но здесь просто, как мне кажется, будет лишним создавать ещё одну таблицу..
Просто по полю service нету ни поиска, ни условий, ничего.
Это лишь для админки увидеть что там в дополнении к товару.
Но если надо так надо.. Спасибо :) | |
|
|
|
|
|
|
|
для: sl1p
(13.01.2010 в 14:47)
| | Вы уже дали понять, что поиск по полю у Вас есть.
Но даже если нету.
Понимаете, это как шуруп отверткой завернуть, а не молотком заколотить.
Если даже Вы не собираетесь вешать на него тяжесть.
Просто после того, как Вы двадцать раз откажетесь от молотка в пользу отвертки, у Вас выработается привычка.
А ненормализованная таблица видна куда явственнее, нежели забитый шуруп. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 14:56)
| | или я совсем туп или х3...:((
Вашу мыслья понял, и полностью с ней согласен во многих случаях... Но поиска тут действительно нету..
в таблице `reserve` поле `services` с таким кривым массивом.
ну и далее из таблицы `services` уже вытягивается нужное..
Как оно может некорректно повлиять на работу не пойму.. | |
|
|
|
|
|
|
|
для: 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
|
несколько грязно, но фактически работоспособно. | |
|
|
|