За последние 24 часа нас посетили 105076 программистов и 3014 роботов. Сейчас ищут 1500 программистов ...

Оптимизация, объединение запросов

Тема в разделе "PHP и базы данных", создана пользователем Padaboo, 21 фев 2010.

  1. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    у меня есть 7 таблиц, надо сразу вывести все позиции где login=$login; структура у всех таблиц разная

    PHP:
    1. $query="SELECT * from `job` WHERE login='$login'";
    2. mysql_query($query,$link);
    3. .....
    4. $query="SELECT * from `worker` WHERE login='$login'";
    5. mysql_query($query,$link);
    6. .....
    и т.п. всего получается 7... вопрос можно ли объединить все это под 1 mysql_query и если да, то как потом вытаскивать полученный результат?
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    когда был одиночный запрос, я делал так:
    PHP:
    1. $query="SELECT * from `job` WHERE login='$login'";
    2. $result=mysql_query($query,$link);
    3. $row = mysql_fetch_array($result);
    и потом из массива вытаскивал нужную мне инфу типа $password=row['password'];
    а если запрос будет выглядеть так:
    PHP:
    1. $query="(SELECT * from `job` WHERE login='$login') UNION (SELECT * from `worker` WHERE login='$login')";
    2. $result=mysql_query($query,$link);
    то как мне результат то оттуда вытащить?
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ну а для чего существуют алиасы?
    Такой запрос знаком:
    [sql]SELECT LAST_INSERT_ID() as ID[/sql]
    Mмм?
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    [sql](SELECT INFO(login,password,...) AS job_info FROM `job` ORDER BY job_info) UNION (SELECT INFO(login,password,....) AS worker_info FROM `worker` ORDER BY worker_info)[/sql]
    правильно? но все равно не понятно как вытащить оттуда инфу...
    PHP:
    1. $jobresult=$result['job_info'];
    2. $jobpassword=$jobresult['password'];
    так?
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ну ты и намудрил, ёпт.
    Ты ж вроде уже не новичок и просто обязан знать о таким функциях, как var_dump.
    Вот и посмотри структуру возвращенного массива, будет гораздо полезней, чем я тут буду распинаться.
     
  7. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    спасибо)
     
  8. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Чё приколист?
    По-моему любой селект всегда возвращает квадратную матрицу.
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Костян
    Квадратную?? =)
     
  10. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    ну прямоугольную, вообще плоскую
     
  11. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    PHP:
    1. $login='padaboo';
    2. $link = mysql_connect("localhost","root","")
    3.          or die("Could not connect: " . mysql_error());
    4. mysql_query("SET NAMES 'cp1251';");
    5. mysql_query("SET CHARACTER SET 'cp1251';");
    6. mysql_query("SET SESSION collation_connection = 'cp1251_general_ci';");
    7. $db="sitedatabase";
    8. mysql_select_db($db)  or  die("Не  могу  открыть  $db:  ".mysql_error());
    9. $query="(SELECT INFO(id,login,spec,edu,exp,city,dop,key) AS job_info FROM `job` ORDER BY job_info WHERE login='$login') UNION
    10. (SELECT INFO(id,login,spec,edu,exp,city,dop,money,key) AS worker_info FROM `worker` ORDER BY worker_info WHERE login='$login')";
    11. $result=mysql_query($query,$link);
    12. $row = mysql_fetch_array($result);
    13. var_dump($row);
    [​IMG]
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\test\index.php on line 13
    NULL
    Напишите пожалуйста 1 пример как это правильно делается
     
  12. в Оракле можно выбрать CUBE =) Ну, результат правда все равно будет впихан в линейное представление, да.
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    select job.id as id_job, job.login as login_job ... from job .... worker.id as id_work, worker.login as login_work ......
    $res['id_job']
    $res['login_work']
     
  14. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    флоппик
    та... оракл такой зверюга, капец...
     
  15. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Костян
    cпасибо
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    [sql](SELECT worker.id as id_worker FROM `worker` WHERE login='$login') UNION (SELECT job.id as id_job FROM `job` WHERE login='$login')[/sql]
    PHP:
    1. echo $row['id_worker'];
    2. echo $row['id_job'];
    результат (
    7
    Notice: Undefined index: id_job in C:\wamp\www\test\index.php on line 14
    то что до UNION находит а 2ю скобку нет...
     
  17. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
     
  18. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    т.е. я могу использовать UNION только для одной и той же таблицы или для таблиц с одинаковой структурой ?
    а никак нельзя объединить совершенно разные запросы?
     
  19. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Что делает union? Грубо говоря он приписывает результаты второй выборки к результатам первой.
    При каких условиях он работает? Количество выбираемых данных в обоих выборках должно быть одинаковым и типы данных соответствующих полей должны быть одинаковыми (или неявно приводимыми - не знаю как там с этим делом у MySQL).

    Т.е. запросы:
    [sql]select intField, varcharField from tabel
    union
    select varcharF, intF from anotherTabel;

    select field from tab union select f1, f2 from table;[/sql]
    неверны.

    Запрос:
    [sql]select intField, varcharField from tabel1
    union
    select intF, varcharF from anotherTabel;[/sql]
    при
    [sql]create table table1(
    intField int,
    varcharField varchar(30));

    create table anotherTable(
    intF int,
    varcharF varchar(30));

    insert into table1(intField, varcharField) values (5, 'tt');
    insert into antherTable(intF, varcharF) values (428, 'aa');
    [/sql]
    должен сработать. Кстати, что он вернет?
     
  20. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    intField=5
    и varcharField = aa
    тогда по идее
    или так
    aatt 433
    а так создал таблицы
    PHP:
    1. $query="((select * from `tabel1` intField, varcharField )
    2. union
    3. (select * from `anotherTabel` intF, varcharF ))";
    4. $result=mysql_query($query,$link);
    5. $row = mysql_fetch_array($result);
    6. echo var_dump($row);
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\test\index.php on line 14
    NULL
    PHP:
    1. $query="select intField, varcharField from tabel1
    2. union
    3. select intF, varcharF from anotherTabel";
    так тожесамое
     
  21. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Padaboo
    ты что вообще, ты запросы обычные писать умеешь?
    select А ТУТ ПОЛЯ ОДИНАКОВЫЕ from t1
    union
    select И ТУТ ОДИНКОВЫЕ form t2
     
  22. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Нет. Он вернет:
    Код (Text):
    1. intField | varcharField
    2. -----------------------
    3. 5        |     tt
    4. 428      |     aa
    И да там названия таблиц при создании и в запросе перепутаны немного: anotherTable - anotherTabel. Тоже и с другой таблицей.

    Вообще и сам мог бы заметить... =)
     
  23. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Костян
    не ругайся просто в запросе было tabel1 вместо table1 ))))
     
  24. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    да я уж заметил))) и так и сяк, пригляделся и спалил)