[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: mysql - объединение полей (кажется так.)
m4a1fox
Доброго времени суток господа! Подскажи те как быть вот с этим. Собственно выборка из БД

function return_month() {
$sql = "SELECT SUBSTRING(`date`,1,7) as month, full_number FROM `".self::$table."`
WHERE SUBSTRING(`date`,1,4) = '"
.date("Y")."'";
return connectDb::sql($sql);
}

/**
* select users from table #2
*/

function show_month() {
$name = '';
$res = $this->return_month();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}

return $name;
}


Вот такой результат возвращает

[0] => Array
(
[
month] => 2011-01
[full_number] => 1 (148) 31 января
)

[
1] => Array
(
[
month] => 2011-02
[full_number] => 2 (149) 14 февраля
)

[
2] => Array
(
[
month] => 2011-02
[full_number] => 3 (150) 28 февраля
)


Так правильно составить выборку, что бы скрипт воспринимал 2 массив как первый, то есть что бы было вот так

[0] => Array
(
[
month] => 2011-01
[full_number] => 1 (148) 31 января
)

[
1] => Array
(
[
month] => 2011-02
[full_number] => 2 (149) 14 февраля
[full_number] => 3 (150) 28 февраля
)


Подскажите! Пожалуйста! Спасибо!



Спустя 9 минут, 3 секунды (17.08.2011 - 14:08) waldicom написал(а):
Они должны группироваться по месяцам? Или по какому признаку?
И кстати kirik и linker показали более удобные способы, чем я (это я про substring)

Спустя 4 минуты, 34 секунды (17.08.2011 - 14:13) linker написал(а):
[full_number] => 2 (149) 14 февраля 
[full_number] => 3 (150) 28 февраля
Не бывает в массиве двух и более элементов с одинаковыми ключами. MySQL так не может, сам ручками с помощью пыха.

Спустя 1 минута, 15 секунд (17.08.2011 - 14:14) m4a1fox написал(а):
waldicom
По месяцам!

Спустя 1 минута, 11 секунд (17.08.2011 - 14:15) linker написал(а):
Получаешь массив
[0] => Array
(
[month] => 2011-01
[full_number] => 1 (148) 31 января
)

[1] => Array
(
[month] => 2011-02
[full_number] => 2 (149) 14 февраля
)

[2] => Array
(
[month] => 2011-02
[full_number] => 3 (150) 28 февраля
)
а потом ручками группируешь.

Спустя 1 час, 32 минуты, 18 секунд (17.08.2011 - 15:47) m4a1fox написал(а):
Господа, чисто теоретический вопрос, скажите, почему функция срабатывает только один раз

function fileExist($data){
$filename = './file/';
$ext = '.pdf';
$scan = scandir($filename);
if(file_exists($filename.$data.$ext)){
return '<a href="'.$filename.$data.$ext.'">';
}
}


если я ее применяю вот так

function implodeDate(){
$name = '<table width="100%" align="right" border="0"><tr>';
$i = 0;
$number = 3;
foreach($this->show_month() as $key=>$value){
$sum = explode(",", $value['full_number']);
$i++;
$name .= '<td><b>'.$this->postDate($value['month']).'</b><br />';
for($t=0; $t<count($sum); $t++){
-------------------------$name .= $this->fileExist($value['number'])----------------------
.
$sum[$t].'</a><br />';
}
if($i == $number){
$i = 0;
$name .= '</tr>';
}
$name .= '</td>';
}
$name .= '</tr></table>';
return $name;
}

Спустя 2 дня, 23 часа, 31 минута, 49 секунд (20.08.2011 - 15:19) m4a1fox написал(а):
Linker
Цитата
MySQL так не может, сам ручками с помощью пыха

Может доказано MySQL!! :)

Нашел ответ! Надеюсь кто наткнется на пост тому поможет! Собственно задача была следующая... вот из этого

[0] => Array
(
[
month] => 2011-01
[full_number] => 1 (148) 31 января
)

[
1] => Array
(
[
month] => 2011-02
[full_number] => 2 (149) 14 февраля
)

сделать вот это

[0] => Array
(
[
month] => 2011-01
[full_number] => 1 (148) 31 января
[full_number] => 2 (149) 14 февраля
)

или

[0] => Array
(
[
month] => 2011-01
[full_number] => 1 (148) 31 января, 2 (149) 14 февраля
)

В общем объединить неким образом!
Собственно основной запрос выглядел так

function return_month() {
$sql = "SELECT SUBSTRING(`date`,1,7) as month, full_number FROM `".self::$table."`
WHERE SUBSTRING(`date`,1,4) = '"
.date("Y")."'";
return connectDb::sql($sql);
}

Он выводил массивы с информацией, первый код, но вот этот запрос

function return_month() {
$sql = "SELECT SUBSTRING(`date`,1,7) as month,
GROUP_CONCAT(`full_number`) as full_number
FROM `"
.self::$table."`
WHERE SUBSTRING(`date`,1,4) = '"
.date("Y")."'";
return connectDb::sql($sql);
}

И вот теперь имеем вид вывода - второй код в этом посту! Удачи!

Спустя 1 день, 17 часов, 25 минут, 3 секунды (22.08.2011 - 08:44) linker написал(а):
m4a1fox
Да мускул может, вот только после mysql_fetch_assoc() (а именно эт оя имел ввиду под "MySQL так не может") у тебя будет только одно поле full_number. По мне задача решена неверное, почему под месяцем 2011-01 присутствует февраль 2 (149) 14 февраля?

Спустя 1 час, 10 минут, 9 секунд (22.08.2011 - 09:54) m4a1fox написал(а):
linker
Цитата
почему под месяцем 2011-01 присутствует февраль 2 (149) 14 февраля

Это просто пример! То что получилось в итоге! То есть как вся эта структура работает, и какой показывает результат. Пример взят не из вывода! smile.gif

Спустя 21 минута, 20 секунд (22.08.2011 - 10:16) linker написал(а):
Отбалды я тоже могу насочинять всего и вся, требуются реальные рабочие примеры.

Спустя 1 час, 48 минут, 23 секунды (22.08.2011 - 12:04) m4a1fox написал(а):
linker
Легко! Вот же недоверчивый :) Пример!

...
[
5] => Array
(
[
month] => 06
[full_number] => 10 (157) 6 июня ,11 (158) 22 июня
)

[
6] => Array
(
[
month] => 07
[full_number] => 13 (160) 18 июля ,12 (159) 4 июля
)

[
7] => Array
(
[
month] => 08
[full_number] => 14 (161) 1 августа ,15 (162) 15 августа ,16 (163) 29 августа
)
...



Запрос

/**
* select month, full_number, number from table #1
*/

private function return_month() {
$sql = "SELECT SUBSTRING(`date`,6,2) as month,
GROUP_CONCAT(`full_number`) as full_number
FROM `"
.self::$table."`
WHERE SUBSTRING(`date`,1,4) = '"
.$this->selectYear()."'
GROUP BY SUBSTRING(`date`,6,2)
"
;
return connectDb::sql($sql);
}

/**
* select month, full_number, number from table #2
*/

public function show_month() {
$name = '';
$res = $this->return_month();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}

return $name;
}

Спустя 13 минут, 6 секунд (22.08.2011 - 12:17) linker написал(а):
:) я такой, только
if(mysql_num_rows($res) > 0) {
лишнее и вначале
$name = array();
так оно интуитивно понятно. И ещё не понятно, почему игнорим функции для работы с датами YEAR(`date`), MONTH(`date`), а вместо этого мучаемся со строками.

Спустя 12 минут, 52 секунды (22.08.2011 - 12:30) m4a1fox написал(а):
linker
Цитата
И ещё не понятно, почему игнорим функции для работы с датами YEAR(`date`), MONTH(`date`), а вместо этого мучаемся со строками

Да хз если честно! Попробовал обрезать - получилось, вот и использовал! А как Вы предлагаете, что то сначала не получилось (что конкретно - не помню), поэтому не стал заморачиваться! А насчет
Цитата
if(mysql_num_rows($res) > 0) {

$name = array();
- за это спасибо - сейчас поправлю!

Спустя 6 минут, 11 секунд (22.08.2011 - 12:36) linker написал(а):
Ну если дата представлена в формате 2011-06-21 (yyyy-mm-dd), то всё должно было получиться сразу. Просто SUBSTRING c его многочисленными цифрами - глаз режет и не сразу видно, что такой запрос делает. Я не настаиваю, я даже не могу сказать как это будет влиять на скорость, просто так.

Спустя 2 минуты, 29 секунд (22.08.2011 - 12:39) m4a1fox написал(а):
linker
Да я понимаю! тогда давай те разберемся! Вот строка (вырвана из запроса)

SELECT SUBSTRING(`date`,6,2) as month,

Вот вариант кот. наиболее удобен

SELECT MONTH(`date`) as month,

Правильно я понимаю?

Но! Первый вариант - срабатывает, а второй - нет! Ни ошибки, ничего - просто не выводит номер!

Спустя 3 минуты, 2 секунды (22.08.2011 - 12:42) m4a1fox написал(а):
linker
Все! Разобрался! Хотите прикольчик (ну я по крайней мере не знал!)! Почему то не срабатывало!

Спустя 3 минуты, 20 секунд (22.08.2011 - 12:45) linker написал(а):
Я не зря обратил внимание на формат даты
SELECT MONTH('2011-08-22')
вернёт значение 8.

P.S. Ну давай, мы ж не гадалки.

Спустя 1 минута, 31 секунда (22.08.2011 - 12:47) m4a1fox написал(а):
У меня есть такой метод -

/**
* method to transform month from table in the field 'date'. Ex.:(02=>февраль)
*/

private function postDate($d) {
$date = $d;
$month = array(
'01' => 'Январь',
'02' => 'Февраль',
'03' => 'Март',
'04' => 'Апрель',
'05' => 'Май',
'06' => 'Июнь',
'07' => 'Июль',
'08' => 'Август',
'09' => 'Сентябрь',
'10' => 'Октябрь',
'11' => 'Ноябрь',
'12' => 'Декабрь'
);
foreach($month as $k => $v)
{
if($k == $date)
return $date_add = $month[$date];
}


То есть строка

SELECT SUBSTRING(`date`,6,2) as month,

Вытаскивала месяцы вот так (01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12) - что - логично так как это ее функция :)
А вот строка

SELECT MONTH(`date`) as month,

Вытаскивала месяцы вот так (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

В связи с этим первый скрипт теперь выглядит вот так

/**
* method to transform month from table in the field 'date'. Ex.:(02=>февраль)
*/

private function postDate($d) {
$date = $d;
$month = array(
'1' => 'Январь',
'2' => 'Февраль',
'3' => 'Март',
'4' => 'Апрель',
'5' => 'Май',
'6' => 'Июнь',
'7' => 'Июль',
'8' => 'Август',
'9' => 'Сентябрь',
'10' => 'Октябрь',
'11' => 'Ноябрь',
'12' => 'Декабрь'
);
foreach($month as $k => $v)
{
if($k == $date)
return $date_add = $month[$date];
}
}



И все работает! Спасибо!

Спустя 34 секунды (22.08.2011 - 12:47) m4a1fox написал(а):
linker
Цитата
вернёт значение 8.

Именно! Просто я - не знал!

Спустя 10 минут, 12 секунд (22.08.2011 - 12:57) linker написал(а):
Ну да, нюанс такой немаловажный.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.