За последние 24 часа нас посетили 36518 программистов и 1718 роботов. Сейчас ищут 815 программистов ...

Сделать выборки по двум ID

Тема в разделе "PHP и базы данных", создана пользователем Artur_hopf, 30 ноя 2018.

  1. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день. Есть запрос который обращается к четырем таблицам чтобы получить одну строчку =)

    Выглядит он так:
    PHP:
    1. SELECT TOP 1 ORE.Наименование as naim
    2. FROM database1 AS RF
    3. JOIN database2 AS RR ON(RF.Reader = RR.Oid )
    4. JOIN database3 AS RL ON (RL.Oid = RF.Label)
    5. JOIN database4 AS ORE ON (ORE.Oid = RL.Asset)
    6. WHERE RR.Asset = '4'
    7. ORDER BY [Date] DESC
    То есть в этом запросе используется выбор одной строки ORE.Наименование которая по дате последняя RF.Date DESC

    Теперь стоит задача выбрать два значения, то есть добавить еще одно условие WHERE.
    Думал будет просто, сделаю так и заработает:
    PHP:
    1. SELECT TOP 1 ORE.Наименование as naim
    2. FROM database1 AS RF
    3. JOIN database2 AS RR ON(RF.Reader = RR.Oid )
    4. JOIN database3 AS RL ON (RL.Oid = RF.Label)
    5. JOIN database4 AS ORE ON (ORE.Oid = RL.Asset)
    6. WHERE RR.Asset = '4' OR RR.Asset = '10'
    7. ORDER BY [Date] DESC
    Но увы, выходит только одна строчка. Сам вопрос как сделать выборку с двумя WHERE RR.Asset?

    Кстати может кому надо, без JOIN в PHP этот запрос выглядит так:
    PHP:
    1. $this->db->select('Label');
    2. $this->db->select( "(SELECT Наименование as name FROM database4
    3. WHERE [Oid] IN (SELECT [Asset]
    4. FROM database3
    5. WHERE [Oid] = Label )) as name");
    6. $this->db->where("[Reader] IN (SELECT [Oid]
    7. FROM database2
    8. WHERE [Asset] = '".$getOid."')");
    9. $this->db->limit('1');
    10. $this->db->order_by('Date','DESC');
    11. $query = $this->db->get('database1');
     
  2. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Или так с join в Yii:
    PHP:
    1. $query->select('ORE.Наименование AS name')
    2. ->from('database1 AS RF')
    3. ->leftjoin('database2 AS RR', 'RF.Reader = RR.Oid')
    4. ->leftjoin('database3 AS RL', 'RL.Oid = RF.Label')
    5. ->leftjoin('database4 AS ORE', 'ORE.Oid = RL.Asset')
    6. ->where(['RR.Asset' => $getOid])
    7. ->orderBy('RF.Date DESC')
    8. ->limit(1);
    9. return $query->all();
    p.s. без join был на CodeIgniter.
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Конечно одна будет, выбор то идёт top 1
     
  4. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @ADSoft На самом деле проблему я решил, не нужно больше тащить два параметра. Но все же на будущее, как можно два WHERE вытащить в такой ситуации?
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Artur_hopf, например, добавить ещё join с подзапросом, получающим максимальное значение даты и конечно-же, убрав top 1 / limit(1).
     
    Artur_hopf нравится это.