Помогите ограничить внутреннее соединение - PullRequest
0 голосов
/ 13 февраля 2011

Мне нужна помощь в ограничении внутреннего соединения.

Таблицы:


пользователей:

  • UID
  • слева
  • активный

файлы:

  • шлагты

UID = шлагты


SELECT uid
FROM users AS u
INNER JOIN files AS x ON u.uid = x.fid
WHERE u.left = '0'
AND u.active = '1'
ORDER BY `u`.`uid` ASC

результат:

uid
3
3
3
3
7
47
47
47
47
47
47
47
47
47
47

Мне нужно ограничить ВНУТРЕННЕЕ СОЕДИНЕНИЕ до 5. поэтому «uid» не будет отображаться более 5 раз. как:

uid
3
3
3
3
7
47
47
47
47
47

Обновление:

Вот код php

 $res = do_sqlquery("SELECT uid FROM users as u INNER JOIN files as x ON u.fid=x.fid WHERE u.left = '0'  AND u.active='1'");
   if (mysql_num_rows($res) > 0)
   {
       while ($arr = mysql_fetch_assoc($res))
       {
       $x=$arr["uid"];
       quickQuery("UPDATE users SET pots = pots+".$GLOBALS["bui"]."*".$cleaint."/900 WHERE id = '$x'");
       }
   }

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

Только для MySQL, без использования PHP

SELECT uid
from (
    SELECT u.uid, @r:= if(@u=u.uid,@r+1,1) r, @u:=u.uid
    FROM users AS u
    CROSS JOIN (select @u:=null) g
    INNER JOIN files AS x ON u.uid = x.fid
    WHERE u.`left` = '0'
    AND u.active = '1'
    ORDER BY u.uid ASC
) U
WHERE U.r <= 5
ORDER BY uid ASC

или, в общем, просто SQL без переменных MySQL

SELECT u.uid
from (
    SELECT u.uid, count(*) C
    FROM users AS u
    INNER JOIN files AS x ON u.uid = x.fid
    WHERE u.`left` = '0'
    AND u.active = '1'
    GROUP BY u.uid
) U inner join (
   select 1 n union all select 2 union all select 3
    union all select 4 union all select 5) V ON U.C>=V.n
ORDER BY U.uid ASC
1 голос
/ 13 февраля 2011

В MySQL:

SELECT CONCAT(`uid`, ":", MAX(5, COUNT(`fid`))) `uid_count`
FROM ...
GROUP BY `uid`

Дает вам такие результаты, как:

uid_count
3:4
7:1
47:5

Например, в PHP вы можете разделить после выборки:

while (FALSE !== ($row = mysql_fetch_assoc($query))) {
    ($uid, $count) = split(':', $row['uid_count'], 2);
}
...