SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.07.2016 17:08:40

domio
Участник
Зарегистрирован: 07.07.2016
Сообщений: 6

Выборка из нескольких таблиц

Здравствуйте. Есть 3 таблицы. Мне нужно сделать запрос, в котором отобразится данные в следующем виде:

login, date, content1, content1.
Вот мой sql запрос


 SELECT reports.content1,  reports_support.*, users.login FROM reports, reports_support, users INNER JOIN users ON users.id=reports_support.user_id ORDER BY reports_support.date DESC LIMIT 5;
 

Ответ: ERROR 1066 (42000): Not unique table/alias: 'users'

Подскажите пожалуйста правильно ли я создаю запрос?



describe users;
+----------+----------------------+------+-----+---------+----------------+
| Field    | Type                 | Null | Key | Default | Extra          |
+----------+----------------------+------+-----+---------+----------------+
| id       | smallint(8) unsigned | NO   | PRI | NULL    | auto_increment |
| login    | varchar(50)          | NO   | UNI |         |                |
+----------+----------------------+------+-----+---------+----------------+
 


describe reports;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| date     | int(11)          | NO   |     | NULL    |                |
| user_id  | int(11)          | NO   |     | NULL    |                |
| content1 | text             | YES  |     | NULL    |                |
| content2 | text             | YES  |     | NULL    |                |
| content3 | text             | YES  |     | NULL    |                |
| content4 | text             | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
 


describe reports_support;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| date     | int(11)          | NO   |     | NULL    |                |
| user_id  | int(11)          | NO   |     | NULL    |                |
| content1 | text             | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
 

Неактивен

 

#2 07.07.2016 18:06:54

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка из нескольких таблиц

Алиасы прописываются вот так (примерно)

SELECT a.*, b.* FROM abrikos a JOIN bulka b ON a.id = b.abrikos_id;


Что до Вашего запроса - не очень понятно, как связаны между собой reports_support и reports.
Вроде как в reports_support должна быть прямая ссылка на  reports?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 07.07.2016 18:12:03

domio
Участник
Зарегистрирован: 07.07.2016
Сообщений: 6

Re: Выборка из нескольких таблиц

deadka написал:

Алиасы прописываются вот так (примерно)

SELECT a.*, b.* FROM abrikos a JOIN bulka b ON a.id = b.abrikos_id;


Что до Вашего запроса - не очень понятно, как связаны между собой reports_support и reports.
Вроде как в reports_support должна быть прямая ссылка на  reports?

Это абсолютно две разные таблицы. Таблица reports содержит информацию которую могут изменять администраторы, а просматривать могут все.
А содержание таблицы  reports_support могут изменять не только администраторы, но и другие пользователи.

Неактивен

 

#4 07.07.2016 18:26:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка из нескольких таблиц

Ну Вы в одну строку хотите связать в результирующем резултсете, отсюда и вопрос... Создайте пример в jsfiddle  с тестовым наполнением и приведите пример желаемого результата?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 07.07.2016 18:46:00

domio
Участник
Зарегистрирован: 07.07.2016
Сообщений: 6

Re: Выборка из нескольких таблиц

https://jsfiddle.net/fhm4ua6s/1/

Возможно моя задумка скажем так "бредовая"))

И надо делать 2 отдельных запроса к БД.

Просто думал что это все можно как то в 1 запросе уместить.

Неактивен

 

#6 07.07.2016 19:35:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка из нескольких таблиц

Прошу прощения, я имел в виду http://sqlfiddle.com/.
По сути - имхо Вы пытаетесь связать 2 несвязанные между собой сущности в одну результирующую таблицу.
Так что пример на sqlfiddle хорошо бы, да, хоть станет ясно, можно ли это в один запрос упихать - и нужно ли.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 07.07.2016 21:14:35

domio
Участник
Зарегистрирован: 07.07.2016
Сообщений: 6

Re: Выборка из нескольких таблиц

http://sqlfiddle.com/#!9/ae8b4

Вот нарисовал схемку. Вот только долго думает(

Отредактированно domio (07.07.2016 21:15:02)

Неактивен

 

#8 07.07.2016 21:31:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка из нескольких таблиц

Да, сегодня как-то совсем туго думает.

SELECT
  u.*,r.*
FROM
  `users` u
   JOIN `reports` r ON u.id = r.user_id;

Это основа для запроса по таблице reports.

SELECT
  u.*,rs.*
FROM
  `users` u
   JOIN `reports_support` rs ON u.id = rs.user_id;
 
 

Это основа для запроса по таблице reports_support.

Но не добавляется ясности, зачем объединять эти два отчета в один - они же по разным сущностям?
>Это абсолютно две разные таблицы.
Представьте себе, что записей будет разное количество в таблицах report и reports_support (для одного пользователя),
и что тогда?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 07.07.2016 21:38:50

domio
Участник
Зарегистрирован: 07.07.2016
Сообщений: 6

Re: Выборка из нескольких таблиц

Премного благодарен.
Я уже немного пересмотрел политику и буду делать два запроса.


    $reportsArr = array();
    $sql = " SELECT reports.date, reports.content1, users.login FROM reports INNER JOIN users ON users.id=reports.user_id ORDER BY reports.date DESC limit 15";
    $result = $link->query($sql);
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            $id = $row['id'];
            $date = date("d-m-Y",$row['date']);
            $time = date("H:i:s",$row['date']);
            $login = $row['login'];
            $content1 = $row['content1'];
            $reportsArr[$date][] = $id."|".$date."|".$time."|".$login."|".$content1;
        }
    } else {
        echo "0 results";
    }
    $sql = "SELECT reports_support.*, users.login FROM reports_support INNER JOIN users ON users.id=reports_support.user_id ORDER BY reports_support.date DESC";
    $result = $link->query($sql);
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            $id = $row['id'];
            $date = date("d-m-Y",$row['date']);
            $time = date("H:i:s",$row['date']);
            $login = $row['login'];
            $content1 = $row['content1'];
            $reportsArr[$date][] = $id."|".$date."|".$time."|".$login."|".$content1;
        }
    } else {        
        Msg("0 results",3);
    }
 

Отредактированно domio (07.07.2016 21:39:11)

Неактивен

 

#10 07.07.2016 21:43:14

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка из нескольких таблиц

Удачи в нелегком деле!

Пара рекомендаций:
1) Все же лучше используйте алиасы в запросах - короче выглядит, легче читается.
2) Не делайте SELECT *, выбирайте только нужные поля. Вслед за Вами поддерживать проект придет новый разработчик, вставит в эту таблицу новый столбец типа BLOB (или JSON, который пока не поддерживается через PHPшную либу для работы с MySQL), и будут в первом случае тормоза адские, а во втором - боль..


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 07.07.2016 21:45:24

domio
Участник
Зарегистрирован: 07.07.2016
Сообщений: 6

Re: Выборка из нескольких таблиц

Спасибо, возьму на заметку.

Неактивен

 

#12 09.08.2016 13:56:57

Aslambek
Участник
Зарегистрирован: 09.08.2016
Сообщений: 4

Re: Выборка из нескольких таблиц

Прошу помочь начинающему, тема схожа вывести значение с разных таблиц

Сейчас у меня код такой
Он выводит информацию с двух таблиц

<?php
   
        If ($ch = $db->get_results("SELECT t.id, t.TrackNameFull, t.Loc, t.Flag, t.Country, s.Simulation, t.Track, t.TrackLength
        FROM "
.$tblprev."track t JOIN ".$tblprev."simulation s ON t.SimID = s.id ORDER BY s.Simulation ASC,t.TrackNameFull ASC"
        ))
        {    
        foreach ( $ch as $d ){
        ?>


Мне необходимо добавить вывод из таблицы с псевдонимом r.location "третья таблица"(я его допишу в select) по аналогии как s.simulation (т.е. таблица location так же имеет id и наименование к каждому id, не могу понять какой синтаксис использовать в FROM), как не добавляю ошибки идут с указанием на синтаксис.

Т.е. в двух словах: вывести название id,из другой таблицы.

Неактивен

 

#13 09.08.2016 14:07:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка из нескольких таблиц

... FROM track t JOIN simulation s ON t.SimID = s.id JOIN `третья таблица` r ON ...

в доке есть примеры с 3мя таблицами
если не получится, показывайте полный вариант запроса и ошибку

Неактивен

 

#14 10.08.2016 08:54:11

Aslambek
Участник
Зарегистрирован: 09.08.2016
Сообщений: 4

Re: Выборка из нескольких таблиц

Попробывал -) Зеленый я совсем

Вот таблицы №1 и №2 (из которых берем значения) и заносим в таблицу №3

[img]http://i11.pixs.ru/thumbs/0/2/6/Bezimeni1j_8529137_22878026.jpg[/img]

Пробую добавлять JOIN в таком виде

   
<?php
If ($ch = $db->get_results("SELECT t.id, t.TrackNameFull, t.Loc, t.Flag, t.Country, s.Simulation, r.Location, t.Track, t.TrackLength
FROM "
.$tblprev."track t JOIN ".$tblprev."simulation s ON t.SimID = s.id JOIN location r ON t.LocID=r.id")){    
foreach ( $ch as $d ){
?>


Получаю ошибку: SQL/DB Error -- [Table 'osr_champ.location' doesn't exist] - т.е. вроде как не видит, и я не правильно подключаю существующую таблицу

Весь код что я вывожу

<table  class="bordered" width="90%" align="center" border="0" cellspacing="0" cellpadding="0" style="border: 0px solid <?php echo $insidebgcolor;?>" bgcolor="<?php echo $cellbgcolor;?>">
    <tr>
    <th><center><b><?php echo $strLabelSimulation;?></b></th>
    <th><center><b></b>запрос</th>
    <th><center><b><?php echo $strLabelLoc;?></b></th>
    <th><center><b><?php echo $strLabelTrack;?></b></th>
    <th><center><b><?php echo $strLabelSimulation."&nbsp;".strtolower($strLabelTrack)."&nbsp;".strtolower($strLabelName);?></b></th>
    <th><center><b><?php echo $strTrackLength;?></b></th>
    <th><center><b><?php echo $strLabelEdit;?></b></th>
    <th><center><b><?php echo $strLabelDelete;?></b></th>
    </tr>
    <?php
        If ($ch = $db->get_results("SELECT t.id, t.TrackNameFull, t.Loc, t.Flag, t.Country, s.Simulation, r.Location, t.Track, t.TrackLength
        FROM ".$tblprev."track t JOIN ".$tblprev."simulation s ON t.SimID = s.id JOIN location r ON t.LocID=r.id"
        ))
        {    
        foreach ( $ch as $d ){
    ?>
            <tr>    
            <td><center><?php    echo $d->Simulation;?></td>
            <td><?php    echo $d->Location;?></td>
            <td><?php print $d->Loc;?></td>
            <td><?php print $d->TrackNameFull;?></td>
            <td><?php print $d->Track;?></td>            
            <td><center><?php print $d->TrackLength;?></td>
            <td><center><a href="maintain-track.php?mode=edit&id=<?php print $d->id;?>"><img src="images/site/edit.gif" border="0" alt="Edit track"></a></td>
            <td><center><a href="maintain-track.php?mode=delete&id=<?php print $d->id;?>" onClick="return confirmAction2()"><img src="images/site/delete.gif" border="0" alt="Delete track"></a></td>
            </tr>
            <?php
            }
       
        } else {
            echo "<tr><td>&nbsp;";
            echo "</td><td>$strLabelNoItemsFound.</td></tr>";
        }
    ?>
    </table>

Отредактированно Aslambek (10.08.2016 08:57:55)

Неактивен

 

#15 10.08.2016 09:33:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка из нескольких таблиц

А как точно называется таблица?
Может там нужен какой-нибудь префикс ($tblprev)?

Неактивен

 

#16 10.08.2016 09:39:15

Aslambek
Участник
Зарегистрирован: 09.08.2016
Сообщений: 4

Re: Выборка из нескольких таблиц

База данных: OSR_champ »Таблица: gpcos_tbllocation

Я вот просто не пойму,если убрать таблицу simulation, а вместо её поставить location то выводит информацию,как положено.
Проблема именно с двух взять значение.

И префикс указан (tbl): .$tblprev."simulation s ON t.SimID = s.id JOIN location r ON t.LocID=r.id"

Отредактированно Aslambek (10.08.2016 09:43:12)

Неактивен

 

#17 10.08.2016 09:43:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка из нескольких таблиц

Таблица: gpcos_tbllocation
а вы пишите просто location
естественно такой таблицы нет

Неактивен

 

#18 10.08.2016 09:44:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка из нескольких таблиц

Aslambek написал:

И префикс указан (tbl): .$tblprev."simulation s ON t.SimID = s.id JOIN location r ON t.LocID=r.id"

но только для simulation
а для location нет

Неактивен

 

#19 10.08.2016 09:52:11

Aslambek
Участник
Зарегистрирован: 09.08.2016
Сообщений: 4

Re: Выборка из нескольких таблиц

Боже мой -) все верно....

.$tblprev."simulation s ON t.SimID = s.id JOIN gpcos_tbllocation r ON t.LocID=r.id"


Просто я думал,если в начале указано , то всё что в кавычках по умолчанию дают приставку....в данном случае с указанием полного наименования работает, как будто что то не правильно и как костыль...

Неактивен

 

#20 10.08.2016 10:01:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка из нескольких таблиц

вместо
gpcos_tbllocation r
вы можете использовать
".$tblprev."location r

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson