Консультация № 169999
29.06.2009, 15:09
0.00 руб.
0 10 1
Здравствуйте.

Скажите пожалуйста,как составить sql запрос ( mysql ,апач ) если необходимо следующее: при загрузке страницы , что бы сортировались прочитанные , не просмотренные, и отмеченные как не обязательные к прочтению запросы авторизованного пользователя (каждый пользователь видит свой список просмотренных , не просмотренных и не обязательных к прочтению запросов)?

Тут не просмотренные -это те которые пользователь увидел первый раз и ещё не поставил птичку checkbox . idq запросов, которые ещё не отмечали в checkbox в таблицу status_query не заносятся(т.е. такие запросы надо выводить вначале,потом со статусом =2 ,потом со статусом=1)
Принцип работы: все запросы сразу заносятся в табицу list_query, а потом user авторизуется и выбирает на своей странице то ,что ему надо.

Таблицы:

---------------------------------------------------------
табица1- list_query
idq | txtquery|

табица2 - users

iduser | name

табица3- status_query

ids | idq(id запроса из таблицы list_query) | reading(просмотренные =1 не обязательные к просмотру=2 ) | iduser (id пользователя для которого выводится его список -запроса из таблицы users )

---------------------------------------------------------------------------------------------------------------
Через внешние ключи делать не надо т.к. они у меня по какой то причине не работают.
Спасибо.

Обсуждение

Неизвестный
29.06.2009, 15:23
общий
Dima1967:
А что мешает сделать например так: (если я правильно понял)

SELECT USERS.IDUSER, USERS.NAME, LIST_QUERY.TEXTQUERY FROM USERS, LIST_QUERY, STATUS_QURY
WHERE
LIST_QUERY.IDQ = STATUS_QUERY.IDQ
AND
STATUS_QUERY.IDUSER = USERS.IDUSER
ORDER BY USERS.IDUSER , STATUS_QURY.READING
--------------------------------
Через внешние ключи делать не надо т.к. они у меня по какой то причине не работают.

Почему не работает?.. просто Вы вероятно не совсем верно сделали.. Надо же правила накладывать на внешние ключи (на удаление, обновление). Но в данном запросе внешние ключи не нужны в принципе.
Неизвестный
29.06.2009, 16:23
общий
Например сначало, получается ,что таблица STATUS_QUERY пустая (в этом случае результат этого запроса null а надо ,что бы вывелись неотмеченные запросы из LIST_QUERY - они там есть и надо что бы их вывели пользователям) - запросы приходят с формы-которая на сайте , вставляются сразу в LIST_QUERY , а дальше - пользователи работают с этими запросами и вставляют данные в STATUS_QUERY т.е. делать ещё один запрос к list_query получается?
Неизвестный
29.06.2009, 17:41
общий
Dima1967:
вот такой запрос попробуйте
Код:

SELECT
USERS.IDUSERS,
USERS.name,
LIST_QUERY.TXTQUERY
FROM
STATUS_QUERY
INNER JOIN LIST_QUERY ON (STATUS_QUERY.ibq = LIST_QUERY.ibq)
RIGHT OUTER JOIN USERS ON (STATUS_QUERY.id_users = USERS.idusers)
ORDER BY
USERS.IDUSERS,
STATUS_QUERY.READING
давно
Академик
320937
2216
29.06.2009, 17:43
общий
это ответ
Здравствуйте, Dima1967.
Правда, на FireBird, но старался придерживаться стандарта SQL

Приложение:
select
0 as rating,
tab1.txtquery,
tab1.idq
from list_query tab1
where not exists
(
select * from status_query tab2
where (tab2.idq = tab1.idq) and (tab2.iduser = :iduser)
)
union
select
1 as rating,
tab1.txtquery,
tab1.idq
from list_query tab1
left outer join status_query tab2 on (tab1.idq = tab2.idq )
where (tab2.reading=2) and (tab2.iduser = :iduser)
union
select
2 as rating,
tab1.txtquery,
tab1.idq
from list_query tab1
left outer join status_query tab2 on (tab1.idq = tab2.idq )
where (tab2.reading=1) and (tab2.iduser = :iduser)
order by 1
Неизвестный
29.06.2009, 17:44
общий
Dima1967:
а вот скрипт БД.. там показано как организовать внешние ключи - всё работает, каскадно удаляется
Код:

SET FOREIGN_KEY_CHECKS=0;

DROP DATABASE IF EXISTS mytest;

CREATE DATABASE mytest
CHARACTER SET 'cp1251'
COLLATE 'cp1251_general_ci';

USE mytest;

#
# Structure for the `list_query` table :
#

DROP TABLE IF EXISTS list_query;

CREATE TABLE list_query (
ibq int(11) NOT NULL AUTO_INCREMENT,
txtquery varchar(255) DEFAULT NULL,
PRIMARY KEY (ibq)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=cp1251;

#
# Structure for the `users` table :
#

DROP TABLE IF EXISTS users;

CREATE TABLE users (
idusers int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) DEFAULT NULL,
PRIMARY KEY (idusers)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251;

#
# Structure for the `status_query` table :
#

DROP TABLE IF EXISTS status_query;

CREATE TABLE status_query (
ids int(11) NOT NULL AUTO_INCREMENT,
ibq int(11) DEFAULT NULL,
reading int(11) DEFAULT NULL,
id_users int(11) DEFAULT NULL,
PRIMARY KEY (ids),
KEY id_users (id_users),
KEY ibq (ibq),
CONSTRAINT status_query_fk1 FOREIGN KEY (ibq) REFERENCES list_query (ibq) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT status_query_fk FOREIGN KEY (id_users) REFERENCES users (idusers) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251;


И еще - не используйте служебные слова, например - NAME, DATE, VALUE и т.д.
Неизвестный
29.06.2009, 18:16
общий
а дальше - пользователи работают с этими запросами и вставляют данные в STATUS_QUERY т.е. делать ещё один запрос к list_query получается?

Вы бы более точно сформулировали требование.
Запрос который я дал - вернет всех пользователей (если поставите WHERE IDUSER = <ид пользователя> то вернет записи для этого пользователя), не зависимо, есть ли у него сообщения или нет. Но такой запрос нельзя редактировать.
Если же Вам надо редактировать, тогда просто надо сделать вложенный запрос.
типа такого:
Код:

SELECT
LIST_QUERY.ibq,
LIST_QUERY.TXTQUERY
FROM
LIST_QUERY
where
LIST_QUERY.ibq in (select ibq from STATUS_QUERY
where STATUS_QUERY.id_users in (select idusers from USERS
where UPPER(USERS.name) = UPPER('петров')
)
)

Неизвестный
29.06.2009, 20:48
общий
Цитата: 19206
Вы бы более точно сформулировали требование.....
Например, с сайта добавили 10 запросов в list_query, в таблицу status_query пользователь 'иванов' занёс статус для 7-ми вопросов - это значит ,что при следующем входе в админчасть у него должна быть следующая картинка перед глазами:
сначало идут 3-ри непросмотренных запроса потом 7-мь просмотренных и того у него перед глазами все 10-ть запросов которые в базе но сгруппированные.


сейчас запросы возращают только то ,что проставленно в status_query т.е. эти 7-мь запросов , а 3-х нет. Надо ,что бы и эти 3-ри тоже были.

У меня хорошо работают:
--------------------------------
SELECT LIST_QUERY.ibq, LIST_QUERY.TXTQUERYFROM LIST_QUERYwhere LIST_QUERY.ibq in (select ibq from STATUS_QUERY where STATUS_QUERY.id_users in (select idusers from USERS where UPPER(USERS.name) = UPPER('петров')
) ) "
и этот

"SELECT USERS.IDUSER, USERS.NAME, LIST_QUERY.TEXTQUERY FROM USERS, LIST_QUERY, STATUS_QURY
WHERE
LIST_QUERY.IDQ = STATUS_QUERY.IDQ
AND
STATUS_QUERY.IDUSER = USERS.IDUSER
ORDER BY USERS.IDUSER , STATUS_QURY.READING
"
"STATUS_QUERY INNER JOIN ......." а этот с ошибкой - я пока разбираюсь.

-----------------------------------------------------------------------------

Спасибо большое за пример с "ключами" . Со служебными словами в именах "хорошо" конечно получилось у меня встречается такое ... я и не знал ..... в ява скрипт тоже есть такие ограничения - экспериментально ))) убедился .
Неизвестный
29.06.2009, 23:51
общий
Здравствуйте leonid59 , у меня не получается запустить Ваш запрос может из-за синтаксиса, о чём тут идёт речь (в смысле о какой таблице и записи) "... left outer join status_query tab2 on (tab1.idq = tab2.idq ..." status_query-это вроде 3-я таблица хотя я всё перепробывал.
Неизвестный
30.06.2009, 06:10
общий
Dima1967:
"STATUS_QUERY INNER JOIN ......." а этот с ошибкой - я пока разбираюсь.

дак, Вы исправте названия полей и таблиц и все будет работать.
Ну, или дайте сюда скрипты создания этих таблиц.
Неизвестный
30.06.2009, 12:42
общий
Цитата: 19206
Dima1967:

© Цитата:
"STATUS_QUERY INNER JOIN ......." а этот с ошибкой - я пока разбираюсь.
разобрался в названиях полей действительно напутал. Он возращает запросы которые были в status_query, а как получить все 10 запросов сгруппировав их ?

Цитата: 255090
Например, с сайта добавили 10 запросов в list_query, в таблицу status_query пользователь 'иванов' занёс статус для 7-ми вопросов - это значит ,что при следующем входе в админчасть у него должна быть следующая картинка перед глазами:
сначало идут 3-ри непросмотренных запроса потом 7-мь просмотренных и того у него перед глазами все 10-ть запросов которые в базе но сгруппированные.

сейчас запросы возращают только то ,что проставленно в status_query т.е. эти 7-мь запросов , а 3-х нет. Надо ,что бы и эти 3-ри тоже были.
Форма ответа