Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь с запросом в MySQL, Как построить вывод информации 
:(
    Опции темы
PROhvost
Дата 16.2.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 16.2.2006

Репутация: нет
Всего: нет



Есть три таблицы:

Код

-- 
-- Структура таблицы `san_data`
-- 

CREATE TABLE `san_data` (
  `id` bigint(20) NOT NULL auto_increment,
  `name` char(255) character set utf8 collate utf8_unicode_ci default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `san_dataname` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ;

-- 
-- Дамп данных таблицы `san_data`
-- 

INSERT INTO `san_data` VALUES (1, 'Виктория');
INSERT INTO `san_data` VALUES (2, 'Ленинские скалы');
INSERT INTO `san_data` VALUES (3, '40 Лет Победы');
INSERT INTO `san_data` VALUES (4, 'Горный воздух');
INSERT INTO `san_data` VALUES (5, 'Солнечный');
INSERT INTO `san_data` VALUES (6, 'Салют');
INSERT INTO `san_data` VALUES (7, 'Геолог Казахстана');

-- 
-- Структура таблицы `san_metaclass1`
-- 

CREATE TABLE `san_metaclass1` (
  `id` bigint(20) NOT NULL auto_increment,
  `data_id` int(11) NOT NULL default '0',
  `field1` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `field1` (`field1`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

-- 
-- Дамп данных таблицы `san_metaclass1`
-- 

INSERT INTO `san_metaclass1` VALUES (1, 1, 4);
INSERT INTO `san_metaclass1` VALUES (2, 2, 1);
INSERT INTO `san_metaclass1` VALUES (3, 3, 2);
INSERT INTO `san_metaclass1` VALUES (4, 4, 3);
INSERT INTO `san_metaclass1` VALUES (5, 5, 1);
INSERT INTO `san_metaclass1` VALUES (6, 6, 1);

-- 
-- Структура таблицы `san_referencevalue`
-- 

CREATE TABLE `san_referencevalue` (
  `id` bigint(20) NOT NULL auto_increment,
  `value` char(255) character set utf8 collate utf8_unicode_ci default '',
  `reference_id` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `value` (`value`,`reference_id`),
  KEY `san_referencevaluevalue` (`value`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

-- 
-- Дамп данных таблицы `san_referencevalue`
-- 

INSERT INTO `san_referencevalue` VALUES (1, 'Пятигорск', 1);
INSERT INTO `san_referencevalue` VALUES (2, 'Кисловодск', 1);
INSERT INTO `san_referencevalue` VALUES (3, 'Железноводск', 1);
INSERT INTO `san_referencevalue` VALUES (4, 'Ессентуки', 1);


Так выглядит код:


Код

$query = "SELECT * FROM san_metaclass1 LEFT JOIN san_referencevalue ON san_metaclass1.field1=san_referencevalue.id ORDER BY value";
$metaclass = mysql_query($query) or die("Query failed : " . mysql_error());

while($row = mysql_fetch_assoc($metaclass)){

extract($row);

echo ''.$value.'<br />';

$query = "SELECT * FROM san_data WHERE id='$data_id'";
$data = mysql_query($query) or die("Query failed : " . mysql_error());
$line = mysql_fetch_assoc($data);
extract($line);
echo '<b>'.$name.'</b><br />';


В итоге получается так:

Ессентуки
Виктория

Железноводск
Горный воздух

Кисловодск
40 Лет Победы

Пятигорск
Ленинские скалы

Пятигорск
Солнечный

Пятигорск
Салют


А нужно:

Ессентуки
Виктория

Железноводск
Горный воздух

Кисловодск
40 Лет Победы

Пятигорск
Ленинские скалы
Солнечный
Салют


Это сообщение отредактировал(а) PROhvost - 17.2.2007, 12:01
PM MAIL   Вверх
Glip
Дата 16.2.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 1
Всего: 18



Цитата(PROhvost @ 16.2.2007,  14:14)

Где: san_data.id=san_metaclass.data_id, san_referencevalue.id=san_metaclass.id

Код

    $query = "SELECT * FROM san_metaclass LEFT JOIN san_referencevalue ON san_metaclass.field=san_referencevalue.id ORDER BY value";
    $metaclass = mysql_query($query) or die("Query failed : " . mysql_error());



смущает что в запросе join по другому критерию, не тому что описан выше, и точно ли там нужен left join


--------------------
user posted image
PM MAIL   Вверх
PROhvost
Дата 16.2.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 16.2.2006

Репутация: нет
Всего: нет



можно JOIN но san_referencevalue  должна читаться последней, иначе не выполнится ORDER BY value.

Это сообщение отредактировал(а) PROhvost - 16.2.2007, 15:17
PM MAIL   Вверх
Glip
Дата 17.2.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 1
Всего: 18



как-то примерно так. 
Код

SELECT  san_referencevalue.value, san_data.name FROM  san_data  JOIN san
_metaclass1 ON (san_data.id=san_metaclass1.data_id)  JOIN san_referencevalue ON
 (san_metaclass1.field1=san_referencevalue.id) order by value, name;


Код

$metaclass = mysql_query($query) or die("Query failed : " . mysql_error());

while($row = mysql_fetch_assoc($metaclass)){
    $result[$row['value']][] = $row['name'];
}

foreach ($result as $value => $names) {
    echo '<b>'.$value.'</b><br />';
    foreach ($names as $name) {
        echo '<b>'.$name.'</b><br />'
    }
    echo '<br />'
}


а правильная сортировка зависит от корректных настроек кодировки в бд. или можно сделать средствами php.


Это сообщение отредактировал(а) Glip - 17.2.2007, 15:03


--------------------
user posted image
PM MAIL   Вверх
PROhvost
Дата 17.2.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 16.2.2006

Репутация: нет
Всего: нет



Спасибо, работает. Я правда не до конца понял как. Еще один вопрос как можно вытянуть в этот кусок 
Код

echo '<b>'.$name.'</b><br />'

id из san_data, т.е. получилось так:
Код

echo ''.$id.' - <b>'.$name.'</b><br />'



Это сообщение отредактировал(а) PROhvost - 19.2.2007, 09:17
PM MAIL   Вверх
Glip
Дата 19.2.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 1
Всего: 18



добавить san_data.id в select и 
Код

$result[$row['value']][$row['id']] = $row['name'];

......

    foreach ($names as $id => $name) {
        echo ''.$id.' - <b>'.$name.'</b><br />'
    }



но в последнем мог и ошибиться


--------------------
user posted image
PM MAIL   Вверх
PROhvost
Дата 20.2.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 16.2.2006

Репутация: нет
Всего: нет



Нет не ошибся, огромное спасибо, очень помог!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.