За последние 24 часа нас посетили 21149 программистов и 1112 роботов. Сейчас ищут 430 программистов ...

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

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

  1. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    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.266
    Симпатии:
    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.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Конечно одна будет, выбор то идёт top 1
     
  4. Artur_hopf

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

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

    Sail Старожил

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