Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> составить запрос. Не знаю как описать. 
V
    Опции темы
zammar
Дата 9.8.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



mysql 5
windows XP 
PHP 5

Как это сделать одним запросом?
таблица разделов:

cat_id     cat_lev    cat_left    cat_right     cat_show
1                1             1                6                0
2                2             2                3                0
3                2             4                5                1

есть настройки:
     выводить скрытые разделы 1 уровня и
     выводить скрытые разделы 2 уровня

cat_show = 0 - скрытый раздел.

если такие настройки
     выводить скрытые разделы 1 уровня  (не установлена)
     выводить скрытые разделы 2 уровня  (установлена)
    то в данном случае запрос должен вывести разделы только второго уровня

или
если такие настройки
     выводить скрытые разделы 1 уровня  (не установлена)
     выводить скрытые разделы 2 уровня  (не установлена)
    то в данном случае запрос должен вывести один раздел второго уровня cat_id = 3
или
если такие настройки
     выводить скрытые разделы 1 уровня  (установлена)
     выводить скрытые разделы 2 уровня  (установлена)
     то в данном случае запрос должен вывести все разделы
или
если такие настройки
     выводить скрытые разделы 1 уровня  (установлена)
     выводить скрытые разделы 2 уровня  (не установлена)
     то в данном случае запрос должен вывести раздел cat_id = 1 и раздел cat_id = 3







PM   Вверх
Gluttton
Дата 9.8.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Не совсем понятно про уровни... (А может я просто ленюсь smile )...

Код

select
    *
from t
    where cat_id=3
    or cat_show=1


Это если всегда выводить раздел cat_id=3, а если ориентироваться только на cat_show, то

Код

select
    *
from t
    where cat_show=1


То?


--------------------
Слава Україні!
PM MAIL   Вверх
zammar
Дата 9.8.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



нет, Gluttton это не то.
запрос должен учитывать установлена ли настройка для того или иного уровня и то являестя ли раздел закрытым (cat_show = 0) или нет
PM   Вверх
gcc
Дата 9.8.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



это дерево?

посмотри тут статьи: http://forum.vingrad.ru/forum/topic-257832/0.html

по-моему это легко делается
PM WWW ICQ Skype GTalk Jabber   Вверх
DimW
Дата 10.8.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(zammar @  9.8.2009,  19:22 Найти цитируемый пост)
Как это сделать одним запросом?


примерно так:
Код

with t as
  (select 1 cat_id, 1 cat_lev, 0 cat_show from dual
   union all 
   select 2 cat_id, 2 cat_lev, 0 cat_show from dual
   union all 
   select 3 cat_id, 2 cat_lev, 1 cat_show from dual)
select * 
  from t
 where (:p_lev_1 = '1' and t.cat_lev = 1 and t.cat_show = 0) -- скрытые разделы 1-го уровня
    or (:p_lev_2 = '1' and t.cat_lev = 2 and t.cat_show = 0) -- скрытые разделы 2-го уровня
    or ((:p_lev_1 = '0' and :p_lev_2 = '0' and t.cat_show != 0) or (:p_lev_1 = '1' and :p_lev_2 = '1')) -- не скрытые разделы


Добавлено через 2 минуты и 47 секунд
параметры p_lev_1 и p_lev_2 могут принимать значения '0' или '1'.
1 - если нужно показывать скрытые разделы.
PM MAIL ICQ   Вверх
zammar
Дата 10.8.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Цитата

with t as
  (select 1 cat_id, 1 cat_lev, 0 cat_show from dual
   union all 
   select 2 cat_id, 2 cat_lev, 0 cat_show from dual
   union all 
   select 3 cat_id, 2 cat_lev, 1 cat_show from dual)
select * 
  from t
 where (:p_lev_1 = '1' and t.cat_lev = 1 and t.cat_show = 0) -- скрытые разделы 1-го уровня
    or (:p_lev_2 = '1' and t.cat_lev = 2 and t.cat_show = 0) -- скрытые разделы 2-го уровня
    or ((:p_lev_1 = '0' and :p_lev_2 = '0' and t.cat_show != 0) or (:p_lev_1 = '1' and :p_lev_2 = '1')) 


Ух ты, это в mysql такая беда делается? че то я с такими вещами не всречался никогда  :(
Если не тяжело расскажите или подкиньте ссылку про то что такое with в начале запроса и что значит вот это ":p_lev_1" = "1" например. 

Это сообщение отредактировал(а) zammar - 10.8.2009, 19:49
PM   Вверх
skyboy
Дата 10.8.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(zammar @  10.8.2009,  18:46 Найти цитируемый пост)
Ух ты, это в mysql такая беда делается?

кажися, это mssql :(
PM MAIL   Вверх
zammar
Дата 10.8.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Нууу обнадежили :(
А как в mysql решить мою задачу? По моему никак. Или может все-таки как-то?  smile
PM   Вверх
skyboy
Дата 10.8.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



я правильно понимаю: структура хранения дерева - nested sets?
PM MAIL   Вверх
Azket
Дата 11.8.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.11.2006
Где: Россия, Краснодар

Репутация: 1
Всего: 1



zammar, поясни принцип, как вообще должна происходить выборка, ибо, если

Цитата(zammar @  9.8.2009,  19:22 Найти цитируемый пост)
выводить скрытые разделы 2 уровня  (установлена)

, то значит значения cat_lev=2 и cat_show=0 (*), так? А если так, то почему должны выбраться 
Цитата(zammar @  9.8.2009,  19:22 Найти цитируемый пост)
то в данном случае запрос должен вывести разделы только второго уровня

то есть cat_id=2 и cat_id=3, но у cat_id=3: cat_lev=2 и cat_show=1, что не соответсвует значению cat_show в (*).

Или нет никакой привязки к значениям полей и нужно просто вывести согласно условиям:
Цитата(zammar @  9.8.2009,  19:22 Найти цитируемый пост)

если такие настройки
     выводить скрытые разделы 1 уровня  (не установлена)
     выводить скрытые разделы 2 уровня  (установлена)
    то в данном случае запрос должен вывести разделы только второго уровня

или
если такие настройки
     выводить скрытые разделы 1 уровня  (не установлена)
     выводить скрытые разделы 2 уровня  (не установлена)
    то в данном случае запрос должен вывести один раздел второго уровня cat_id = 3
или
если такие настройки
     выводить скрытые разделы 1 уровня  (установлена)
     выводить скрытые разделы 2 уровня  (установлена)
     то в данном случае запрос должен вывести все разделы
или
если такие настройки
     выводить скрытые разделы 1 уровня  (установлена)
     выводить скрытые разделы 2 уровня  (не установлена)
     то в данном случае запрос должен вывести раздел cat_id = 1 и раздел cat_id = 3


И еще вопрос, у тебя в таблице только 3 записи, или это фрагмент?
PM MAIL ICQ   Вверх
DimW
Дата 11.8.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(zammar @  10.8.2009,  19:46 Найти цитируемый пост)
что такое with в начале запроса 

это тестовые данные которые я для себя самого и сгенерил. в mysql возможно этого нет, но не суть.

Цитата(zammar @  10.8.2009,  19:46 Найти цитируемый пост)
и что значит вот это ":p_lev_1" = "1" например.

Цитата(DimW @  10.8.2009,  12:11 Найти цитируемый пост)
параметры p_lev_1 и p_lev_2 могут принимать значения '0' или '1'.
1 - если нужно показывать скрытые разделы. 

т.е. это твои параметры:
Цитата(zammar @  9.8.2009,  19:22 Найти цитируемый пост)
выводить скрытые разделы 1 уровня и
     выводить скрытые разделы 2 уровня

в mysql вроде объявляются так: $p_lev_1.

а внимание нужно обратить на:
Код

select * 
  from t
 where (:p_lev_1 = '1' and t.cat_lev = 1 and t.cat_show = 0) -- скрытые разделы 1-го уровня
    or (:p_lev_2 = '1' and t.cat_lev = 2 and t.cat_show = 0) -- скрытые разделы 2-го уровня
    or ((:p_lev_1 = '0' and :p_lev_2 = '0' and t.cat_show != 0) or (:p_lev_1 = '1' and :p_lev_2 = '1')) -- не скрытые разделы


извиняюсь за неточность ответа, вслед. раз захвачу с собой слюнявчик...


Это сообщение отредактировал(а) DimW - 11.8.2009, 08:32
PM MAIL ICQ   Вверх
zammar
Дата 11.8.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



1) skyboy,  да, структура  делева nested sets.

2)

a)  Azket. Да, немного  не понятно объяснил я. Если "выводить скрытые разделы 2 уровня  (установлена)" то это значит что нужно выводить И В ТОМ ЧИСЛЕ скрытые разделы, а НЕ скрытые разделы нужно выводить в любом случае. 
т.е. настройки действуют только на скрытые разделы. Не скрытые разделы выводяться по любому.

б) таблица большая это пример. да, кусок можно сказать.

3) DimW, вечером буду пробовать.
PM   Вверх
Azket
Дата 11.8.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.11.2006
Где: Россия, Краснодар

Репутация: 1
Всего: 1



Код
select * from T where (cat_show=1)or((cat_show=0)and(((cat_lev=1)and(@p_l1=1))or((cat_lev=2)and(@p_l2=1))))

делал на MSSQL, думаю от MySQL будет отличаться только написанием имени параметров.
@p_l1 - выводить скрытые разделы 1 уровня (1-да, не 1-нет)
@p_l2 - выводить скрытые разделы 2 уровня (1-да, не 1-нет)


Это сообщение отредактировал(а) Azket - 11.8.2009, 13:05
PM MAIL ICQ   Вверх
DimW
Дата 11.8.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(zammar @  11.8.2009,  11:54 Найти цитируемый пост)
3) DimW, вечером буду пробовать. 

учитывая что требования изменились(вернее вы их уточнили):
Цитата(zammar @  11.8.2009,  11:54 Найти цитируемый пост)
выводить И В ТОМ ЧИСЛЕ скрытые разделы

то лучше возьмите вариант от Azket.
PM MAIL ICQ   Вверх
zammar
Дата 11.8.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 30.10.2008

Репутация: нет
Всего: нет



Цитата

select * from T where (cat_show=1)or((cat_show=0)and(((cat_lev=1)and(@p_l1=1))or((cat_lev=2)and(@p_l2=1))))

Да, это то что надо.    smile  Спасибо всем. Как я опять сам не догадался, блин  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.