проблема работы с подтвержденным и неподтвержденным контентом

tony2001

TeaM PHPClub
проблема работы с подтвержденным и неподтвержденным контентом

Господа!
Наткнулись тут на проблему, похоже, что конкретно тормозим...

Есть задача:
на сайте должен быть подтвержденный и неподтвержденный контент.
Версий контента всего две - которая покаывается (рабочая) и которую надо подтвердить и она заменит собой рабочую.

Пока сделано так - есть рабочая, подтвержденная запись, которая показывается на сайте.
Неподтвержденная запись лежит в той же таблице и ссылается на рабочую.

Надо:
сделать вывод (постраничный, с поиском и сортировкой) по этой таблице.
если есть неподтвержденная версия, то вместо рабочей надо выводить, искать, сортировать по неподтвержденной.
если есть только рабочая - юзаем только её.
(напоминаю - они в одной таблице).

Варианты решения:
1. джойнить таблицы.
- но неподтвержденног контента может не быть, а нам надо искать и сортировать по нему если он есть.
2. держать всегда рабочую и нерабочую версии, пускай даже они будут в 90% случаев одинаковые.
- но неэкономно (и попахивает извратом, честно сказать).

Имхо, тут где-то была ошибка на стадии проектирования, но могу ошибаться.

Если кто-нить решал подобное - поделитесь, плз, опытом.
 

AnToXa

prodigy-одаренный ребенок
1. попробовать сделать left join на саму себя.
2. ввести доп поле - активная версия и просто выбирать все что активно
 

tony2001

TeaM PHPClub
лефт джоин не совсем то - мы джойним фактически подтвержденные с _возможными_ неподтвержденными.
и мы не знаем какие брать - слева или справа, т.к. справа (нерабочие версии) могут и не быть.
то есть IF'ов будет до ж... и неизвестно как сортировать тогда.
 

AnToXa

prodigy-одаренный ребенок
повторю, что сказал в канале для истории :)

[17:51] <AnToXa> хотя.... мне кажется, что будет правильным хранить 2 разные таблицы... даже 2 разные базы данных
[17:51] <AnToXa> идеологически правильным, я имею в виду
[17:51] <mvc_off> с какой целью
[17:51] <AnToXa> но. т.к. очевидно лень переделывать, то с полем хорошо
[17:51] <AnToXa> mvc_off: 2 причины
[17:52] <AnToXa> 1. разделение прав, даже если сломают одну
[17:52] <AnToXa> 2. скорость
[17:52] <AnToXa> и 3
[17:52] <AnToXa> "инкапсуляция" лучше
[17:52] <AnToXa> т.е. скрипту не надо знать, что могут быть подтвержденные и нет, он просто работает с таблицей
[17:53] <AnToXa> а миграция записей может осуществляться совсем отдельно
[17:53] <AnToXa> вот
 

tony2001

TeaM PHPClub
<tony2001> дело не в этом - нам в админской части надо выводить ЕСЛИ ЕСТЬ, то неподтвержденную, ЕСЛИ НЕТ, то рабочую
<tony2001> сортировать и искать точно так же надо
<tony2001> через ЕСЛИ ЕСТЬ

<tony2001> SELECT t1.*, t2.* FROM table as t1 LEFT JOIN table as t2 ON t1.id=t2.approoved WHERE t2 LIKE <-вот тут что искать?-> ORDER BY <а тут по чему сортировать?>
 

Доктор

Новичок
SELECT IF(unconfirmed!="",unconfirmed,confirmed) as value from our_table where value like "%cto_to_tam%";

должно работать
 

tony2001

TeaM PHPClub
угу...
и ИФ на каждое поле
и таблиц штук 20
и в каждой штук по 10-ть полей...
такая версия уже была.
 

Доктор

Новичок
Офигительный IF просто. У тебя есть хоть один вариант лучше? По быстродействию хотя бы?
 

Vasya

Guest
Недавно что-то похожее було...

CREATE TABLE xarticles (
id int(10) auto_increment primary key,
article_num int(10),
confirmed enum('Y','N') NOT NULL,
content text
);
create unique index ixarticles on xarticles (article_num, confirmed);
insert into xarticles (article_num, confirmed, content) values(2,'Y','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(2,'N','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(20,'Y','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(20,'N','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(22,'Y','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(22,'N','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(21,'N','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(21,'Y','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(27,'N','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(27,'Y','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(28,'Y','kqwelkjqwklej')
insert into xarticles (article_num, confirmed, content) values(29,'Y','kqwelkjqwklej')


select article_num, MIN(confirmed) from xarticles
group by article_num;

2,N
20,N
21,N
22,N
27,N
28,Y
29,Y

А вот тут, конечно, не хватает вложенных запросов. То есть

select t1.* FROM xarticles t1,
(select article_num, MIN(confirmed) AS conf from xarticles
group by article_num) t2
WHERE t1.article_num = t2.article_num AND t1.confirmed = t2.conf
 
Сверху