PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
nextdrift
Отправлено: 13 Февраля, 2011 - 15:53:28
Гость
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2010
Помог: 0 раз(а)
Всем доброе время суток. Вот решил модернизировать свой запрос. В итоге пришёл к тому, что необходимо его писать с нуля.
Значит есть таблица связей пользователей. От неё и будет всё плясать.
Помимо неё есть ещё три таблицы.
1) - инфа о пользователе
2) - цитаты пользователя
3) - сообщения пользователя
Все 4 таблицы необходимо собрать в 1 массив.
Схема таблиц:
1) связи (от которой необходимо плясать)
----------------------
id| fid | uid | status // fid, uid - иды пользователей, статус - подтверждена ли связка
2) инфа
---------------------
id | тут вообщем много всего // id - ид пользователя
3) соощения
---------------------
id | user_id | text | date
4) цитаты
--------------------
id| user_id | author | cit | date
Как собрать всё это в одну кучу?
(Добавление)
Просто подскажите куда копать
(Добавление)
пока получается следующий код:
CODE (
SQL ):
скопировать код в буфер обмена
SELECT
users. name ,
users. avatar ,
users. id AS uId ,
chirp. date AS date ,
chirp. count_c ,
chirp. text ,
chirp. id AS cId ,
chirp. type ,
cit. date AS date ,
cit. type
FROM
`friends`
INNER JOIN
`chirp`
ON
( chirp. user_id = friends. uid OR chirp. user_id = friends. fid)
INNER JOIN
`cit`
ON
( friends. uid = cit. user_id OR friends. fid = cit. user_id)
INNER JOIN
`users`
ON
( friends. uid = users. id OR friends. fid = users. id)
WHERE
( friends. uid = '$user_id' OR friends. fid = '$user_id' )
AND
friends. STATUS = 'y'
ORDER BY
chirp. date
DESC
LIMIT 8
но в результате я получаю 8 одинаковых записей. И нужно еще сделать сортировку chirp.date и cit.date вместе, а не по отдельности, чтобы общим потоком
(Добавление)
Чуть правил запрос. (исключил публикации самого пользователя)
CODE (
SQL ):
скопировать код в буфер обмена
SELECT
users. name ,
users. avatar ,
users. id AS uId ,
chirp. date AS date ,
chirp. count_c ,
chirp. text AS text ,
chirp. id AS cId ,
chirp. type ,
cit. date AS date ,
cit. type
FROM
`friends`
INNER JOIN
`chirp`
ON
( friends. uid = chirp. user_id OR friends. fid = chirp. user_id)
INNER JOIN
`cit`
ON
( friends. uid = cit. user_id OR friends. fid = cit. user_id)
INNER JOIN
`users`
ON
( friends. uid = users. id OR friends. fid = users. id)
WHERE
( friends. uid = '$user_id' AND friends. fid != '$user_id' OR friends. uid != '$user_id' AND friends. fid = '$user_id' )
AND
friends. STATUS = 'y'
AND
( cit. user_id != '$user_id' OR chirp. user_id != '$user_id' OR users. id != '$user_id' )
ORDER BY
chirp. date
DESC
LIMIT 8
а вот var_damp ()
array(8) {
["name"]=>
string(10) "ЭУП-101"
["avatar"]=>
string(19) "21_110204064220.jpg"
["uId"]=>
string(2) "21"
["date"]=>
string(19) "2011-02-07 11:17:45"
["count_c"]=>
string(1) "0"
["text"]=>
string(115) "«Практика всегда дает пинка теории» © Тимур Гагин"
["cId"]=>
string(2) "23"
["type"]=>
string(3) "cit"
}
nextdrift
Отправлено: 13 Февраля, 2011 - 18:36:21
Гость
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2010
Помог: 0 раз(а)
А при вот такой комбинации вообще пусто... Уже голова пухнет
CODE (
SQL ):
скопировать код в буфер обмена
SELECT
users. name ,
users. avatar ,
users. id AS uId ,
chirp. date AS date ,
chirp. count_c ,
chirp. text AS text ,
chirp. id AS cId ,
chirp. type ,
cit. date AS date ,
cit. type
FROM
`friends`
INNER JOIN
`users`
ON
( friends. uid = users. id OR friends. fid = users. id)
INNER JOIN
`chirp`
ON
( users. id = chirp. user_id AND chirp. user_id != '$user_id' )
INNER JOIN
`cit`
ON
( users. id = cit. user_id AND cit. user_id != '$user_id' )
WHERE
users. id != '$user_id'
AND
friends. STATUS = 'y'
ORDER BY
chirp. date
DESC
LIMIT 8
(Добавление)
Ну что-то начинает прояснятся ))))))))))))
Вроде как работает.... Но ещё не до конца протестировал
Вот код
CODE (
SQL ):
скопировать код в буфер обмена
SELECT
users. name ,
users. avatar ,
users. id AS uId ,
chirp. date AS date ,
chirp. count_c ,
chirp. text AS text ,
chirp. id AS cId ,
chirp. type ,
cit. id AS citId ,
cit. date AS date ,
cit. cit ,
cit. type
FROM
`friends`
INNER JOIN
`users`
ON
( friends. uid = users. id OR friends. fid = users. id)
LEFT OUTER JOIN
`chirp`
ON
( users. id = chirp. user_id AND chirp. user_id != '$user_id' )
LEFT OUTER JOIN
`cit`
ON
( users. id = cit. user_id AND cit. user_id != '$user_id' )
WHERE
( friends. STATUS = 'y' AND users. id != '$user_id' )
ORDER BY
chirp. date
DESC
LIMIT 8
А ресурс, который помог понять конструкцию - http://www[dot]skillz[dot]ru/dev/php/art[dot][dot][dot]INNER_OUTER[dot]html
(Добавление)
Блин... Походу не пашет. То несколько раз одну запись выводит, то ещё какая фигня.
Подскажите как правильнее.....
(Добавление)
Нашёл проблему, почему повторяется.
Вот дамп:
array(11) {
["name"]=>
string(33) "Белозёрцев Сергей"
["avatar"]=>
string(19) "15_110129072437.jpg"
["uId"]=>
string(2) "15"
["date"]=>
string(19) "2011-02-13 11:40:34"
["count_c"]=>
string(1) "0"
["text"]=>
string(170) "«Есть два слова. Одним начинается, другим кончается история» © Энди. Просто Энди"
["cId"]=>
string(2) "22"
["type"]=>
string(3) "cit"
["citId"]=>
string(2) "17"
["cit"]=>
string(27) "Тестирование ))"
["author"]=>
string(31) "Энди. Просто Энди"
}
а нужно разделить. цитаты от сообщений.
а я использовал вот такую конструкцию
if ($c['cit'] !== false)
{
и тут дизайн для цитат
}
else
{
тут дизайн для сообщений
}
nextdrift
Отправлено: 13 Февраля, 2011 - 21:03:17
Гость
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2010
Помог: 0 раз(а)
пока реализую через UNION (не гибкий вариант)
CODE (
SQL ):
скопировать код в буфер обмена
(
SELECT
users. name ,
users. avatar ,
users. id AS uId ,
chirp. id AS cId ,
chirp. date AS date ,
chirp. text AS text ,
chirp. type AS type ,
chirp. count_c AS other
FROM
`friends`
INNER JOIN
`users`
ON
( friends. uid = users. id OR friends. fid = users. id)
LEFT OUTER JOIN
`chirp`
ON
( users. id = chirp. user_id AND chirp. user_id != '$user_id' )
WHERE
( friends. STATUS = 'y' AND users. id != '$user_id' )
)
UNION
(
SELECT
users. name ,
users. avatar ,
users. id AS uId ,
cit. id AS cId ,
cit. date AS date ,
cit. cit AS text ,
cit. type AS type ,
cit. author AS other
FROM
`friends`
INNER JOIN
`users`
ON
( friends. uid = users. id OR friends. fid = users. id)
LEFT OUTER JOIN
`cit`
ON
( users. id = cit. user_id AND cit. user_id != '$user_id' )
WHERE
( friends. STATUS = 'y' AND users. id != '$user_id' )
)
ORDER BY
date
DESC
LIMIT 8
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB