вывод данных из связанных таблиц

neonet

Новичок
вывод данных из связанных таблиц

Есть 2 таблицы в связке..

1 -я: Содержит в себе контактные данные по категориям - клиенты, отправитель, получатель, и т.п
PHP:
CREATE TABLE `clients` (
  `clt_id` int(11) NOT NULL auto_increment,
  `clt_name` varchar(255) NOT NULL,
  `clt_street` varchar(255) NOT NULL,
  `clt_city` varchar(255) NOT NULL,
  `clt_country` varchar(255) NOT NULL,
  `clt_telefon` varchar(255) NOT NULL,
  `clt_mail` varchar(255) NOT NULL,
  `clt_category` varchar(255) NOT NULL,

  PRIMARY KEY (clt_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2-я: Поля qry_sender, qry_recipient, qry_transporter, qry_client этой таблици связанны с clients.clt_id
PHP:
CREATE TABLE `query` (
`qry_id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`qry_sender` int( 11 ) default NULL,
`qry_recipient` int( 11 ) default NULL,
`qry_transporter` int( 11 ) default NULL,
`qry_client` int( 11 ) default NULL,
`qry_for` varchar( 255 ) NOT NULL ,
`qry_loading` date NOT NULL ,
`qry_discharge` date NOT NULL ,
`qry_user` int( 11 ) NOT NULL ,
`qry_datetime` datetime NOT NULL ,
`qry_status` int( 11 ) NOT NULL ,
`qry_bemerkungen` text NOT NULL ,
`qry_stapelbar` int( 11 ) NOT NULL ,

PRIMARY KEY ( `qry_id` ),
FOREIGN KEY ( `qry_sender` ) REFERENCES `clients` ( `clt_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ( `qry_recipient` ) REFERENCES `clients` ( `clt_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION ,
FOREIGN KEY ( `qry_transporter` ) REFERENCES `clients` ( `clt_id` )  ON DELETE NO ACTION ON UPDATE NO ACTION ,
FOREIGN KEY ( `qry_client` ) REFERENCES `clients` ( `clt_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
Задача такая:
сделать SQL-запрос таким чтоб выводил все данные из таблицы 'query' включая строки где в полях NULL , и по ID *(лежащие в:qry_sender, qry_recipient, qry_transporter, qry_client ) подменивал данные на данные из clients.clt_name .

Такой запрос дает возможность вытащить clients.clt_name и поставить его вместо query.qry_sender.

Пример 1:
PHP:
    $q = "select  clients.clt_name , *
    from `query`
    LEFT JOIN clients ON clients.clt_id = query.qry_sender";
   
while ($row = mysql_fetch_array($q)) {

echo $row['qry_id']."|".$row['clt_name']."|".$row['qry_datetime']."<br>"; 
}
Пробую сделать так
Пример 2:
PHP:
    $q = "select  clients.clt_name , *
    from `query`
    LEFT JOIN clients ON clients.clt_id = query.qry_sender
    LEFT JOIN clients ON clients.clt_id = query.qry_recipient
    LEFT JOIN clients ON clients.clt_id = query.qry_transporter
    LEFT JOIN clients ON clients.clt_id = query.qry_client";
не выходит, да и не понятно из какой переменной вытащить clt_name для каждого поля (qry_sender, qry_recipient, qry_transporter, qry_client ) в отдельности.
Можно канечно убрать категории с таблицы clients и вместо них сделать несколько таблиц , И сделать таким образом:
Пример 3:
PHP:
    $q = "select  clients.clt_name , *
    from `query`
    LEFT JOIN sender ON sender.sender_id = query.qry_sender
    LEFT JOIN recipient ON recipient.recipient _id = query.qry_recipient
    LEFT JOIN transporter ON transporter.transporter_id = query.qry_transporter
    LEFT JOIN clients ON clients.clt_id = query.qry_client";
но так делать не очень хочеться, Подскажите пожалуйста, есть ли возможность сделать таким образом чтоб при выводе данных циклом в переменную $row['qry_sender'] - попадали бы данные из clients.clt_name по ID ?
Пока только получаеться вывести данные из clients.clt_name которые попадают в масив $row['clt_name'] только для одной любой категории (qry_sender, qry_recipient, qry_transporter, qry_client )*Пример 1.


Может быть с подзапросом? вот только как это реальизовать я пока не могу понять
Или что то вроде этого?
PHP:
SELECT * FROM clients as clt, query as qry
where (
        clt.clt_id = qry.qry_sender
        ) and (
        clt.clt_id = qry.qry_recipient
        ) and (
        clt.clt_id = qry.qry_transporter 
        )and (
        clt.clt_id = qry.qry_clients
        )
Что посоветуете:?

:confused:
 

Gas

может по одной?
делай как во втором варианте

не понятно из какой переменной вытащить clt_name для каждого поля (qry_sender, qry_recipient, qry_transporter, qry_client ) в отдельности
добавь алиасы на таблицу clients, например clients AS c_sender, clients AS c_client, ... и при выборе обращайся c_sender.name AS name_sender, c_client.name AS name_client
 

neonet

Новичок
Делаю запрос такого плана:
PHP:
select  query.*, c_sender.clt_name AS name_sender, c_client.clt_name AS name_client 
    from `query`, clients AS c_sender, clients AS c_client
    LEFT JOIN c_sender ON name_sender = query.qry_sender
    LEFT JOIN c_client ON name_client = query.qry_client
Mysql возвращает ошыбку:
PHP:
#1066 - Not unique table/alias: 'c_sender'
 

neonet

Новичок
Задачу решил вот так
to Gas Спасибо огромное за помощь
PHP:
$sql = "SELECT query.*, 
c_sender.clt_name AS name_sender, 
c_recipient.clt_name AS name_recipient,
c_transporter.clt_name AS name_transporter,
c_client.clt_name AS name_client

FROM `query`
    
LEFT JOIN clients AS c_sender ON c_sender.clt_id = query.qry_sender
    LEFT JOIN clients AS c_recipient ON c_recipient.clt_id = query.qry_recipient
    LEFT JOIN clients AS c_transporter ON c_transporter.clt_id = query.qry_transporter
    LEFT JOIN clients AS c_client ON c_client.clt_id = query.qry_client";
    $qry = mysql_query($sql,$link);

    while ($row = mysql_fetch_array($qry)){

    	echo "<pre>";
    	echo print_r($row);
    	echo "</pre>";

на выходе получаю масив с переменной с именем которое мне и нужно было из $row['name_sender'] , $row['name_client'] .. и т.п.
PHP:
Array
(
    [0] => 1
    [qry_id] => 1
    [1] => 
    [qry_sender] => 
    [2] => 3
    [qry_recipient] => 3
    [3] => 
    [qry_transporter] => 
    [4] => 
    [qry_client] => 
    [5] => 
    [qry_for] => 
    [6] => 0000-00-00
    [qry_loading] => 0000-00-00
    [7] => 0000-00-00
    [qry_discharge] => 0000-00-00
    [8] => 0
    [qry_user] => 0
    [9] => 0000-00-00 00:00:00
    [qry_datetime] => 0000-00-00 00:00:00
    [10] => 0
    [qry_status] => 0
    [11] => 
    [qry_bemerkungen] => 
    [12] => 0
    [qry_stapelbar] => 0
    [13] => 
    [name_sender] => 
    [14] => dasdasds
    [name_recipient] => dasdasds
    [15] => 
    [name_transporter] => 
    [16] => 
    [name_client] => 
)
-~{}~ 14.12.08 01:12:

А как теперь произвести поиск по таблице query ? и соответсвеенно и по полям Имен (clients.clt_name)

Так не получаеться выдает ошибку:
PHP:
<?
$good = "test";

$sql = "SELECT query.*, c_sender.clt_name AS name_sender, c_recipient.clt_name AS name_recipient, c_transporter.clt_name AS name_transporter,  c_client.clt_name AS name_client
		FROM `query`
    LEFT JOIN clients AS c_sender ON c_sender.clt_id = query.qry_sender
    LEFT JOIN clients AS c_recipient ON c_recipient.clt_id = query.qry_recipient
    LEFT JOIN clients AS c_transporter ON c_transporter.clt_id = query.qry_transporter
    LEFT JOIN clients AS c_client ON c_client.clt_id = query.qry_client
    WHERE
	`name_sender` LIKE '%". str_replace(" ", "%' OR `name_sender` LIKE '%", $good) ."%'
 	OR `name_recipient` LIKE '%". str_replace(" ", "%' OR `name_recipient` LIKE '%", $good) ."%'
	OR `name_transporter` LIKE '%". str_replace(" ", "%' OR `name_transporter` LIKE '%", $good) ."%'
	OR `name_client` LIKE '%". str_replace(" ", "%' OR `name_client` LIKE '%", $good) ."%'
	OR `qry_bemerkungen` LIKE '%". str_replace(" ", "%' OR `qry_bemerkungen` LIKE '%", $good) ."%'

    ";
    $qry = mysql_query($sql,$link);

    while ($row = mysql_fetch_array($qry)){

    	echo "<pre>";
    	echo print_r($row);
    	echo "</pre>";


    }
?>
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/mars42/html/wedbesign/sql/index.php on line 20


Подозреваю, что я неправильно состваил SQL запрос,
 

Beavis

Banned
neonet
А ты проверь, правильно или нет ты составил SQL запрос.. И если неправильно, посмотри сообщение об ошибке.
 

neonet

Новичок
MySQL жалуеться на 20 ю строчку моего скрипта - и это:
PHP:
`name_sender` LIKE '%". str_replace(" ", "%' OR `name_sender` LIKE '%", $good) ."%'
но ессли в запросе подменять Алиасы на существующие поля.. тогда скрипт нормально заработает..- но так он не будет искать по имени, и лишь по номеру ID .

Дайте пня для прального направления.. )..

-~{}~ 16.12.08 22:24:

Всё, сделал как надо:

`c_clients.clt_name` LIKE '%". str_replace(" ", "%' OR `name_sender` LIKE '%", $good) ."%'

Всё отлично рабоатет как надо.
 
Сверху