Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выборка с 4-х таблиц по совпадению с 1-ой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nextdrift
Отправлено: 13 Февраля, 2011 - 15:53:28
Post Id


Гость


Покинул форум
Сообщений всего: 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):
скопировать код в буфер обмена
  1.  
  2.  
  3.   SELECT
  4.     users.name          ,
  5.     users.avatar        ,
  6.     users.id   AS uId   ,
  7.    
  8.     chirp.date AS date  ,
  9.     chirp.count_c       ,
  10.     chirp.text          ,
  11.     chirp.id   AS cId   ,
  12.     chirp.type          ,
  13.    
  14.     cit.date   AS date  ,
  15.     cit.type
  16.   FROM
  17.     `friends`
  18.  
  19.   INNER JOIN
  20.     `chirp`
  21.   ON
  22.     (chirp.user_id = friends.uid OR chirp.user_id = friends.fid)
  23.  
  24.   INNER JOIN
  25.     `cit`
  26.   ON
  27.     (friends.uid = cit.user_id OR friends.fid = cit.user_id)
  28.        
  29.  
  30.   INNER JOIN
  31.     `users`
  32.   ON
  33.     (friends.uid = users.id OR friends.fid = users.id)
  34.  
  35.   WHERE
  36.     (friends.uid = '$user_id' OR friends.fid = '$user_id')
  37.   AND
  38.     friends.STATUS = 'y'
  39.  
  40.   ORDER BY
  41.     chirp.date
  42.   DESC
  43.  
  44.   LIMIT 8
  45.  
  46.  


но в результате я получаю 8 одинаковых записей. И нужно еще сделать сортировку chirp.date и cit.date вместе, а не по отдельности, чтобы общим потоком
(Добавление)
Чуть правил запрос. (исключил публикации самого пользователя)
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.  
  3.   SELECT
  4.     users.name          ,
  5.     users.avatar        ,
  6.     users.id   AS uId   ,
  7.    
  8.     chirp.date AS date  ,
  9.     chirp.count_c       ,
  10.     chirp.text AS text  ,
  11.     chirp.id   AS cId   ,
  12.     chirp.type          ,
  13.    
  14.     cit.date   AS date  ,
  15.     cit.type
  16.   FROM
  17.     `friends`
  18.  
  19.   INNER JOIN
  20.     `chirp`
  21.   ON
  22.     (friends.uid = chirp.user_id OR friends.fid = chirp.user_id)
  23.  
  24.   INNER JOIN
  25.     `cit`
  26.   ON
  27.     (friends.uid = cit.user_id OR friends.fid = cit.user_id)
  28.        
  29.  
  30.   INNER JOIN
  31.     `users`
  32.   ON
  33.     (friends.uid = users.id OR friends.fid = users.id)
  34.  
  35.   WHERE
  36.     (friends.uid = '$user_id' AND friends.fid != '$user_id' OR friends.uid != '$user_id' AND friends.fid = '$user_id')
  37.   AND
  38.     friends.STATUS = 'y'
  39.   AND
  40.     (cit.user_id != '$user_id' OR chirp.user_id != '$user_id' OR users.id != '$user_id')
  41.   ORDER BY
  42.     chirp.date
  43.   DESC
  44.  
  45.   LIMIT 8
  46.  



а вот 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"
    }
 
 Top
nextdrift
Отправлено: 13 Февраля, 2011 - 18:36:21
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




А при вот такой комбинации вообще пусто... Уже голова пухнет
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.  
  3.   SELECT
  4.     users.name          ,
  5.     users.avatar        ,
  6.     users.id   AS uId   ,
  7.    
  8.     chirp.date AS date  ,
  9.     chirp.count_c       ,
  10.     chirp.text AS text  ,
  11.     chirp.id   AS cId   ,
  12.     chirp.type          ,
  13.    
  14.     cit.date   AS date  ,
  15.     cit.type
  16.   FROM
  17.     `friends`
  18.  
  19.   INNER JOIN
  20.     `users`
  21.   ON
  22.     (friends.uid = users.id OR friends.fid = users.id)
  23.    
  24.    
  25.   INNER JOIN
  26.     `chirp`
  27.   ON
  28.     (users.id = chirp.user_id AND chirp.user_id != '$user_id')
  29.  
  30.  
  31.   INNER JOIN
  32.     `cit`
  33.   ON
  34.     (users.id = cit.user_id AND cit.user_id != '$user_id')
  35.  
  36.   WHERE
  37.     users.id != '$user_id'
  38.   AND
  39.     friends.STATUS = 'y'
  40.    
  41.   ORDER BY
  42.     chirp.date
  43.   DESC
  44.  
  45.   LIMIT 8
  46.  
  47.  

(Добавление)
Ну что-то начинает прояснятся ))))))))))))
Вроде как работает.... Но ещё не до конца протестировал

Вот код
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.   SELECT
  3.     users.name          ,
  4.     users.avatar        ,
  5.     users.id   AS uId   ,
  6.    
  7.     chirp.date AS date  ,
  8.     chirp.count_c       ,
  9.     chirp.text AS text  ,
  10.     chirp.id   AS cId   ,
  11.     chirp.type          ,
  12.    
  13.     cit.id     AS citId ,
  14.     cit.date   AS date  ,
  15.     cit.cit             ,
  16.     cit.type
  17.   FROM
  18.     `friends`
  19.  
  20.   INNER JOIN
  21.     `users`
  22.   ON
  23.     (friends.uid = users.id OR friends.fid = users.id)
  24.    
  25.    
  26.   LEFT OUTER JOIN
  27.     `chirp`
  28.   ON
  29.     (users.id = chirp.user_id AND chirp.user_id != '$user_id')
  30.  
  31.  
  32.   LEFT OUTER JOIN
  33.     `cit`
  34.   ON
  35.     (users.id = cit.user_id AND cit.user_id != '$user_id')
  36.  
  37.   WHERE
  38.    
  39.     (friends.STATUS = 'y' AND users.id != '$user_id')
  40.    
  41.   ORDER BY
  42.     chirp.date
  43.   DESC
  44.  
  45.   LIMIT 8
  46.  




А ресурс, который помог понять конструкцию - 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
{
тут дизайн для сообщений
}
 
 Top
nextdrift
Отправлено: 13 Февраля, 2011 - 21:03:17
Post Id


Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




пока реализую через UNION (не гибкий вариант)
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2.   (
  3.     SELECT
  4.       users.name          ,
  5.       users.avatar        ,
  6.       users.id   AS uId   ,
  7.      
  8.       chirp.id   AS cId   ,
  9.       chirp.date AS date  ,
  10.       chirp.text AS text  ,
  11.       chirp.type AS type  ,
  12.       chirp.count_c AS other
  13.      
  14.     FROM
  15.       `friends`
  16.    
  17.     INNER JOIN
  18.       `users`
  19.     ON
  20.       (friends.uid = users.id OR friends.fid = users.id)
  21.      
  22.      
  23.     LEFT OUTER JOIN
  24.       `chirp`
  25.     ON
  26.       (users.id = chirp.user_id AND chirp.user_id != '$user_id')
  27.     WHERE
  28.      
  29.       (friends.STATUS = 'y' AND users.id != '$user_id')
  30.   )
  31.   UNION
  32.   (
  33.     SELECT
  34.       users.name          ,
  35.       users.avatar        ,
  36.       users.id   AS uId   ,
  37.      
  38.       cit.id     AS cId   ,
  39.       cit.date   AS date  ,
  40.       cit.cit    AS text  ,
  41.       cit.type   AS type  ,
  42.       cit.author AS other
  43.      
  44.     FROM
  45.       `friends`
  46.    
  47.     INNER JOIN
  48.       `users`
  49.     ON
  50.       (friends.uid = users.id OR friends.fid = users.id)
  51.    
  52.     LEFT OUTER JOIN
  53.       `cit`
  54.     ON
  55.       (users.id = cit.user_id AND cit.user_id != '$user_id')
  56.     WHERE
  57.      
  58.       (friends.STATUS = 'y' AND users.id != '$user_id')
  59.   )
  60.  
  61.  
  62.   ORDER BY
  63.     date
  64.   DESC
  65.  
  66.   LIMIT 8
  67.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB