За последние 24 часа нас посетили 20560 программистов и 1009 роботов. Сейчас ищут 368 программистов ...

Выборка из двух таблиц

Тема в разделе "MySQL", создана пользователем Иван Фадеев, 24 июн 2012.

  1. Иван Фадеев

    Иван Фадеев Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    9
    Симпатии:
    0
    Читал, читал, ничего не понял...

    Есть две таблицы - t1(id, name) и t2(id, name).
    Код (Text):
    1. SELECT `id` FROM `t1`,`t2` WHERE `name` = 'vasya'
    Как синтаксически правильно построить этот запрос?
     
  2. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    проще всего так
    SELECT `id` FROM `t1` WHERE `name` = 'vasya'
    UNION
    SELECT `id` FROM `t2` WHERE `name` = 'vasya'
     
  3. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А по моему проще указать какой именно ид выводить если оба то так

    Код (Text):
    1.  
    2. SELECT t1.id, t2.id FROM `t1`,`t2` WHERE `name` = 'vasya'
     
  4. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    уверен)?
    Добавлено спустя 3 минуты 53 секунды:
    у меня был сходный вариант но там нюансы:
    вместо одного столбца получаем 2
    запрос ведёт себя неочевидно, если ид дублируются
    Код (Text):
    1. SELECT tab1.id, tab2.id
    2. FROM`tab1` ,`tab2`
    3. WHERE tab1.`name`='va'
    4. AND tab2.`name`='va'
    Добавлено спустя 9 минут 52 секунды:
    о, вот оно - аналогичное решение без юнион, но врядли оно проще
    Код (Text):
    1. SELECT DISTINCT if( f1 = f2, t3.id1, t3.id2 ) AS res
    2. FROM (
    3.  
    4. SELECT rand( 120) AS f1
    5. FROM tab1
    6. LIMIT 2
    7. ) AS tmp
    8. JOIN (
    9.  
    10. SELECT rand( 120) AS f2
    11. ) AS tmp1, (
    12.  
    13. SELECT tab1.id AS id1, tab2.id AS id2
    14. FROM`tab1` ,`tab2`
    15. WHERE tab1.`name`='va'
    16. AND tab2.`name`='va'
    17. ) AS t3
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ух да ты уже и проверил :)

    Ладно что скажешь про JOIN он то по моему оптимален :)

    Код (Text):
    1.  
    2. SELECT t1.id, t2.id FROM `t1` JOIN `t2` USING(id) WHERE `name` = 'vasya'
     
  6. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    та жеж ошибка :)

    Добавлено спустя 11 минут 18 секунд:
    и вот, кстати, почему ты решил что можно по ид таблицы связать.. не, ну обычную практику оставим, из постановки задачи можно сделать вывод, что там лежат разные данные, не связанные между собой
     
  7. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    проверил, согласен:)

    все таки union как то не хорошо, простой селект лучше

    SELECT t1.id, t2.id FROM `t1`,`t2` WHERE t1.name = 'vasya' AND t2.name = 'vasya'
     
  8. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    а чем тебе вариант с рандом не нравится)))?
     
  9. Иван Фадеев

    Иван Фадеев Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    9
    Симпатии:
    0
    Всем спасибо!
    Сделал по первому варианту с UNION.
     
  10. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    афтар, не мешай обсуждению задачи :)
     
  11. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А уточни если не сложно тебе есть разница в 1 столбце или в 2?

    Поясни, что там не очевидного?
     
  12. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    куча дублей. неэстетично :)

    в 1-й табле искомые ид - 2, 10, во второй - 1,10
    итого получаем
    2, 1
    10, 1
    2, 10
    10, 10
    если совпадений с именем будет больше - соотв размер выборки будет расти в геометрической прогрессии
     
  13. Иван Фадеев

    Иван Фадеев Активный пользователь

    С нами с:
    20 июн 2012
    Сообщения:
    9
    Симпатии:
    0
    По сути, нет.
    Задача - понять, есть ли хоть одно совпадение по значению ячейки, из двух таблиц, с заданной переменной.
    Выбрал UNION, поскольку необходимо проверить вышеописанное по двум переменным и, соответственно, 4 столбцам двух таблиц.
    JOIN селект в данном случае визуально перегружается:
    Код (Text):
    1. SELECT t1.id, t2.id FROM `t1`,`t2` WHERE t1.name = 'vasya' OR t2.name = 'vasya' OR t1.age = '18' OR t2.age = '18'
    Как-то так.
     
  14. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    о, кстати, smitt, в случае с and при наличии совпадений в 1-й табле и отсутствии таковых во второй запрос тоже некорректно отработает. не зря мне этот вариант не нравился. а в случае or - да, задача будет выполнена, хотя и не та, которую мы решали :)

    Добавлено спустя 3 минуты 27 секунд:
    неслабая перегрузка :))))
     
  15. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Пожалуй соглашусь:) Union то что нужно...