|
|
|
| Здравствуйте, подскажите пожалуйста или ссылку дайте. У меня данные выводятся так:
Иванов - бампер
Иванов - крыло
Иванов - спойлер
, а как сделать, что бы имя выводилось один раз, а напротив имени все его заказы | |
|
|
|
|
|
|
|
для: sancho
(17.03.2005 в 12:02)
| | Нужно больше информации... А как сейчас выводится? | |
|
|
|
|
|
|
|
для: cheops
(17.03.2005 в 12:22)
| | На данный момент выводится так,
select b.INFO, a.INFO2 from
(
select SUBSTR(INFO,23) as INFO2,
from zakaz where INSTR(INFO, 'myshop.ru') = 0
group by SUBSTR(INFO,23)
) a
left join
(select INFO from zakaz where (INSTR(INFO, 'myshop.ru') > 0
group by INFO) b
order by INFO
|
нужно чтобы имя выдовало только один раз и все его заказы | |
|
|
|
|
|
|
|
для: sancho
(17.03.2005 в 13:10)
| | Дело в том, что SQL не предназначен для таких манипуляций - здесь следует обработать данную ситуацию во внешней программе, выводящей запрос пользователю, т.е. обработать ситуацию в цикле вывода. | |
|
|
|
|
|
|
|
для: cheops
(17.03.2005 в 13:38)
| | А не подскажите как можно это реализовать? | |
|
|
|
|
|
|
|
для: sancho
(17.03.2005 в 13:58)
| | Например есть три таблицы
clients с данными о клиенте
fields:
c_id
c_name
________________________
goods с данными о товарах
g_id
g_name
------------------------------------------
orders с данными о покупках
fields
order_id
c_id
g_id
Соответсвенно заполняем эти таблицы.
И потом уже будет легко составить запрос который будет по id клиента выводить информацию о его заказах
<?
// получаем имя покупателя
$sql="SELECT name FROM clients where c_id=".$id;
$query=mysql_query($sql);
$r=mysql_fetch_array($query1);
$c_name=$r['name'];
?>
<table>
<tr><td><?=$c_name;?></td></tr>
<tr><td>
<?//получаем информацию о заказах
$sql="SELECT t2.g_name FROM goods t1,orders t2
WHERE t1.g_id=t2.g_id
AND t2.c_id=".$id;
$query=mysql_query($sql);
while ($r=mysql_fetch_array($query)){
echo $r['g_name']."<br>";
}
?>
</td></tr>
</table>
|
Надеюсь смысл понятен...
PS Это в теории баз данных называется приведение к третьей (если не ошибаюсь) канонической форме | |
|
|
|
|
|
|
|
для: Axxil
(17.03.2005 в 16:11)
| | Спасибо, щас попробую. | |
|
|
|
|
|
|
|
для: sancho
(17.03.2005 в 17:57)
| | А если нет возможности использовать третью таблицу, то как еще можно реализовать? Подскажите пожалуйста, pls :-((( | |
|
|
|
|
|
|
|
для: sancho
(18.03.2005 в 11:35)
| | Помогите pls с проблемой. | |
|
|
|
|
|
|
|
для: sancho
(18.03.2005 в 17:44)
| | Хм... а вы бы привели структуру ваших таблиц, тогда проще было бы помочь, просто не очень понятно, что требуется, когда перед глазами нет таблиц. | |
|
|
|
|
|
|
|
для: cheops
(18.03.2005 в 19:38)
| | Есть одна таблица, в которой хранится IP адреса пользователей и список посещаемых ресурсов(INFO) этим пользователем, также в INFO хранится имя пользователя и имя его компа в таком виде (Иванов Иван (pc001.myshop.ru)). Из этой таблицы я вывожу имя пользователя, список ресурсов на которых был пользователь, IP'шник и счетчик посещения того или иного ресурса, вот таким образом:
select b.name, a.resurs, a.counter, a.IP from
(
select
IP
SUBSTR(INFO,23) as resurs,
count (INFO) as counter
from TABLE
where INSTR(INFO, 'myshop.ru') = 0
group by IP, SUBSTR(INFO,23)
) a
left join
(select IP, name from TABLE where (INSTR(INFO, 'myshop.ru') > 0) group by IP, INFO) b
on a.IP = b.IP
order by name
|
в итоге выглялит, вот так:
Иванов Иван (pc001.myshop.ru) - посещаемый ресурс№1 - 5 - IP
Иванов Иван (pc001.myshop.ru) - посещаемый ресурс№2 - 2 - IP
Иванов Иван (pc001.myshop.ru) - посещаемый ресурс№3 - 5 - IP
Иванов Иван (pc001.myshop.ru) - посещаемый ресурс№4 - 4 - IP
|
надо что бы имя пользователя выводилось один раз. Может как то средствами PHP можно это сделать, подскажите пожалуйста? | |
|
|
|
|
|
|
|
для: sancho
(21.03.2005 в 10:45)
| | неужели никто не знает? | |
|
|
|
|
|
|
|
для: sancho
(21.03.2005 в 10:45)
| | Я бы не стал менять SQL-запрос, а проверял бы значение имени следующим манером:
<?php
// Устанавливаем соединение с базой данных
include "config.php";
// Формируем SQL-запрос
$sql="select b.name, a.resurs, a.counter, a.IP from
(
select
IP
SUBSTR(INFO,23) as resurs,
count (INFO) as counter
from TABLE
where INSTR(INFO, 'myshop.ru') = 0
group by IP, SUBSTR(INFO,23)
) a
left join
(select IP, name from TABLE where (INSTR(INFO, 'myshop.ru') > 0) group by IP, INFO) b
on a.IP = b.IP
order by name";
// Выполняем SQL-запрос
$res = mysql_query($sql);
// Проверяем корректность его выполнения
if(!$res) exit(mysql_error());
// Временная переменная
$name_old = "";
// В цикле выводим результат
while($r = mysql_fetch_array($res))
{
$name = $r['b.name'];
if($name == $name_old) $print_name = "";
else $print_name = $name;
// Присваиваем временной переменной $name_old
// текущее значение имени
$name_old = $name;
// Вывод строки с именами и прочим
echo $print_name." (".$r['a.resurs'].") - Посещаемый ресур №<br>";
}
?>
|
Т.е. храним имя с предыдущей итерации цикла во временной переменной $name_old, если оно не совпадает на следующей итерации с именем извлечённым из базы данных - значит перед нами новое имя - выводим его, если совпадает, значит старое имя - вместо имени выводим пустую строку. | |
|
|
|
|
|
|
|
для: cheops
(22.03.2005 в 00:17)
| | Спасибо Cheops, за идею, сработало!!! | |
|
|
|