Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP][MySQL] Не простой запрос, помогите решить. / 20 сообщений из 20, страница 1 из 1
01.12.2012, 11:48
    #38060927
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Есть файл который запускается кроном, он должен посчитать
количество строк где есть совпадения с ячейками другой таблицы.

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


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
$res = mysql_query("SELECT `id` FROM `table1`");//Смотрим какие есть айдишки.
$arr = array();
 
while($rows = mysql_fetch_row($res)){
 
    $arr[] = $rows[0];
    echo $rows[0];
}


$r = mysql_query("SELECT COUNT(*) FROM `table1`
                  WHERE `id` =".$rows[0]."");//Считаем количество строк в которых есть совпадения по айдишкам.

 
while($row = mysql_fetch_row($r)){
 
    
    echo $row;
}



Но что-то у меня ничего не получается, подскажите-помогите, как быть?
...
Рейтинг: 0 / 0
01.12.2012, 11:48
    #38060929
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

ой, во втором запросе `table2`
...
Рейтинг: 0 / 0
01.12.2012, 12:31
    #38060962
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

1.
Код: php
1.
echo $row;

не будет работать, нужно указать конкретное поле для вывода.
2. Второй запрос вернет данные только по последнему значению $rows[0], которое осталось после первого цикла.
3. Очень сильно подозреваю, что задача решается одним запросом. Примерно, что-то вроде такого (возможно, ошибся где-то):
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
  COUNT(`table2`.`id`),  AS `count_id`,
  `table2`.`id` AS `tbl2_id`
FROM `table1`
JOIN `table2` ON `table2`.`id`=`table1`.`id`
GROUP BY `table2`.`id`
...
Рейтинг: 0 / 0
01.12.2012, 12:45
    #38060974
phpz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

Если нужно просто посчитать кол-во совпадений, то лучше сделать за один запрос. Вариантов здесь много, например:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$ids = "";
$res = mysql_query("SELECT `id` FROM `table1` WHERE `id`>0"); //Смотрим какие есть айдишки.

while($rows = mysql_fetch_row($res)){
    $ids .= "'" . $rows[0] . "',";
}
$ids = rtrim($ids,',');  // удалим лишнюю запятую

$res = mysql_query("SELECT COUNT(`id`) FROM `table2` WHERE `id` IN ($ids)"); //Считаем количество строк в которых есть совпадения по айдишкам.
$row = mysql_fetch_row($res);
echo $row[0];
}
...
Рейтинг: 0 / 0
01.12.2012, 12:46
    #38060975
phpz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Пока правил, vkle уже ответил xD
...
Рейтинг: 0 / 0
01.12.2012, 12:50
    #38060980
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Ой! Точно! Это же объединенный запрос! Спасибо! :)
...
Рейтинг: 0 / 0
02.12.2012, 14:05
    #38061604
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Не получается. Помогите, кто может, пожалуйста!

Если подробней то, структура такая:

table1
iduser_idscore

table2
iduser_id

в таблице два (table2) неизвестное количество записей.
в таблице один (table1) неизвестное количество записей.

Раз в сути запускается cron(-ом) файл, его задача
посчитать количество записей в (table2), где просто айдишки.
И записать сумму в table1, где user_id = user_id из table2

в таблице2 может быть 100 записей, а в таблице1 может быть 3 айдишки.

По логике у меня получается следующая структура
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$res = mysql_query("SELECT COUNT(user_id) FROM table1
                                           WHERE user_id =(SELECT user_id FROM table2);
                                           while($rows = mysql_fetch_row($res)){
                                           $arr = array();
                                           $arr[] = $rows[0];
                                          
                                           $que = mysql_query("UPDATE table1 SET score =".$arr[]." WHERE user_id =(SELECT user_id FROM table2));
                                           }



тут я запуталась окончательно :) помогите пожалуйста решить.
...
Рейтинг: 0 / 0
02.12.2012, 14:07
    #38061605
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

ой в первой строке ошибка
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$res = mysql_query("SELECT COUNT(user_id) FROM table2
                                           WHERE user_id =(SELECT user_id FROM table1);
                                           while($rows = mysql_fetch_row($res)){
                                           $arr = array();
                                           $arr[] = $rows[0];
                                          
                                           $que = mysql_query("UPDATE table1 SET score =".$arr[]." WHERE user_id =(SELECT user_id FROM table2));
                                           }
...
Рейтинг: 0 / 0
02.12.2012, 15:49
    #38061657
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
А намудрили то... Нафига этот вложенный селект и массив? Все проще.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
$sql = <<<SQL
SELECT 
    COUNT( `table2`.`user_id` ) AS `count_id` , 
    `table2`.`user_id` AS `user_id`
FROM 
    `table1`
JOIN 
    `table2` ON `table2`.`user_id` = `table1`.`user_id`
GROUP BY 
    `table2`.`user_id`
SQL;


$res = mysql_query($sql);
while($row = mysql_fetch_assoc($res)) {
    $sql = "UPDATE `table1` SET `score`={$row['count_id']} WHERE `user_id`={$row['user_id']}";
    mysql_query($sql);
}



Подозреваю, что можно и еще проще, вообще без цикла в PHP.
...
Рейтинг: 0 / 0
02.12.2012, 17:24
    #38061719
SergSW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

Лучше это триггерами делать и тогда никаких доп. запросов по расписанию не надо.
Единственное наши доблесные недохостеры запрещают создание триггеров и хранимых процедур.

Если используете БД по лучше MySQL (PgSQL, MS SQL, Oracle) то вашу проблему тоже можно решить одним запросом
...
Рейтинг: 0 / 0
02.12.2012, 17:29
    #38061725
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
vkle, Ого!!! Очень круто, всё работает как надо, супер, спасибо, буду разбирать как это работает :)
...
Рейтинг: 0 / 0
02.12.2012, 17:31
    #38061730
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
SergSW,

Да, спасибо, за совет, предыдущий ответ вполне решает задачу, триггеры по моему нельзя (бесплатный хостинг)
...
Рейтинг: 0 / 0
02.12.2012, 17:40
    #38061741
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша итриггеры по моему нельзя (бесплатный хостинг)Если не ошибаюсь, пользовательские триггеры и хранимки зависят от версии MySQL, а не от [бес]платности хостинга.
...
Рейтинг: 0 / 0
02.12.2012, 17:58
    #38061756
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
А вот ещё такой вопрос, если перед добавлением (update)
сумму поделить на выбранное число (int) из той же таблицы table1
соответствующего user_id

id user_id int score


vkleА намудрили то... Нафига этот вложенный селект и массив? Все проще.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
$sql = <<<SQL
SELECT 
    COUNT( `table2`.`user_id` ) AS `count_id` , 
    `table2`.`user_id` AS `user_id`
FROM 
    `table1`
JOIN 
    `table2` ON `table2`.`user_id` = `table1`.`user_id`
GROUP BY 
    `table2`.`user_id`
SQL;


$res = mysql_query($sql);
while($row = mysql_fetch_assoc($res)) {
    $sql = "UPDATE `table1` SET `score`={$row['count_id']} WHERE `user_id`={$row['user_id']}";
    mysql_query($sql);
}

$res = mysql_query("SELECT `int`,`score` FROM `table1`");
$arr = array();

while($rows = mysql_fetch_assoc($res))
$arr . = $rows['score'] / $rows['int'];
 {
    $sql = "UPDATE `table1` SET `score`={$arr .} WHERE `user_id`={$row['user_id']}";
    mysql_query($sql);

}



Подозреваю, что можно и еще проще, вообще без цикла в PHP.

Скорее всего не правильно, подскажите пожалуйста как быть тут?
...
Рейтинг: 0 / 0
02.12.2012, 18:38
    #38061786
SergSW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
vkle,

Это как повезёт мне и платные попадались которые триггеры запрещали в принципе, мотивировали требованиями безопастности
...
Рейтинг: 0 / 0
02.12.2012, 19:40
    #38061827
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша исумму поделить на выбранное число (int) из той же таблицы table1Так делите прямо в SQL-запросе, чего данные туда-сюда гонять то...
...
Рейтинг: 0 / 0
02.12.2012, 20:11
    #38061846
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
vkleМаша исумму поделить на выбранное число (int) из той же таблицы table1Так делите прямо в SQL-запросе, чего данные туда-сюда гонять то...

Я не понимаю где именно и как это прописать, помогите пожалуйста!
Я поняла что результирующее вот это - count_id. Его и нужно поделить на выбраное (int) from table1
А где и как его выудить не догоняю... :)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$sql = <<<SQL
SELECT 
    COUNT( `table2`.`user_id` ) AS `count_id` , 
    `table2`.`user_id` AS `user_id`
FROM 
    `table1`
JOIN 
    `table2` ON `table2`.`user_id` = `table1`.`user_id`
GROUP BY 
    `table2`.`user_id`
SQL;
...
Рейтинг: 0 / 0
02.12.2012, 20:27
    #38061861
SergSW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.cnt/tbl1.int, t.uid FROM (
	SELECT count(*) as cnt, user_id as uid from ...
) t, table1 tbl1
WHERE tbl1.user_id = t.uid

...или так

SELECT t.cnt/t.int, t.uid FROM (
	SELECT count(*) as cnt, table1.user_id as uid, table1.int from ...
	GROUP BY 2,3
) t


Первый вариант для случая если делить надо на значение не связанное с table1 (т.к. в этом случае скорее всего не получится сделать по нему группировку и при этом не испортить count)
...
Рейтинг: 0 / 0
03.12.2012, 11:02
    #38062256
Маша и
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
SergSWМаша и,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.cnt/tbl1.int, t.uid FROM (
	SELECT count(*) as cnt, user_id as uid from ...
) t, table1 tbl1
WHERE tbl1.user_id = t.uid

...или так

SELECT t.cnt/t.int, t.uid FROM (
	SELECT count(*) as cnt, table1.user_id as uid, table1.int from ...
	GROUP BY 2,3
) t


Первый вариант для случая если делить надо на значение не связанное с table1 (т.к. в этом случае скорее всего не получится сделать по нему группировку и при этом не испортить count)

Я же говорила что запрос сложный :)
Чего-то я не поняла куда это здесь нужно вставить?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$sql = <<<SQL
SELECT 
    COUNT( `table2`.`user_id` ) AS `count_id` , 
    `table2`.`user_id` AS `user_id`
FROM 
    `table1`
JOIN 
    `table2` ON `table2`.`user_id` = `table1`.`user_id`
GROUP BY 
    `table2`.`user_id`
SQL;
...
Рейтинг: 0 / 0
03.12.2012, 17:34
    #38063060
SergSW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP][MySQL] Не простой запрос, помогите решить.
Маша и,

Ничего сложного если разобраться с документацией.
добавляете поле int в Ваш запрос оборачиваете это ещё одним селектом в котором делите
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP][MySQL] Не простой запрос, помогите решить. / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]