как выбрать данные из нескольких таблиц с переменным условием |MySQL - PullRequest
0 голосов
/ 24 мая 2018

У меня есть две таблицы в базе данных для хранения основной информации о клиенте (имя, местоположение, номер телефона) и другая таблица для хранения транзакций, связанных с клиентом (date_sub, profile_sub, isPaid, date_exp, client_id), и у меня есть HTML-таблица для просмотраосновная информация о клиенте и транзакции, если они доступны, моя проблема в том, что я не могу получить запрос для выбора информации о клиенте из таблицы internetClient и из internetclientDetails одновременно, поскольку запросрезультат только тогда, когда у клиента есть trans в таблице подробностей.поля таблицы следующие:

internetClient

--------------------------------------------------------
id         full_name       location    phone_number
-------------------------------------------------------
4         Joe Amine         beirut       03776132
5         Mariam zoue       beirut       03556133

и

internetclientdetails 

--------------------------------------------------------------------------
incdid   icid      date_sub      date_exp      isPaid      sub_price
----------------------------------------------------------------------------
  6        4      2018-01-01     2018-01-30      0           2000
  7        5      2017-01-01     2017-01-30      0           1000
  8        4      2018-03-01     2018-03-30      1           50000
  9        5      2018-05-01     2019-05-30      1           90000

// incdid > internetClientDetailsId
// icid> internetClientId

, если у клиента есть trans в orderdetails, запрос должен возвращать значение, подобное этому:

    client_id    full_name           date_sub     date_exp      isPaid    sub_price
-------------------------------------------------------------------------------------
       4          Joe Amine          2018-03-01     2018-03-30      1           50000
       5           Mariam zoue       2018-05-01     2019-05-30      1           90000

иначе, если у клиента нет идентификатора в internetOrederDetails

    --------------------------------------------------------
    icid      full_name       location    phone_number
    -------------------------------------------------------
    4         Joe Amine         beirut       03776132
    5         Mariam zoue       beirut       0355613

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

РЕЗЮМЕ

Мы генерируем набор данных, содержащий только ICID и max (date_sub) (псевдоним: ICDi) Мы присоединяем его к InternetClientDetails (ICD), чтобы получить только максимальную запись датыза клиента.Затем оставьте присоединиться к записи IC;обеспечение сохранения всех записей InternetClient (IC);и показывать только связанную максимальную подробную запись.

Приведенный ниже подход должен работать в большинстве версий mySQL.Он не использует аналитику, которую мы могли бы использовать, чтобы получить максимальную дату вместо производной таблицы, при условии, что поддерживаемая вами версия MySQL *

ФИНАЛЬНЫЙ ОТВЕТ:

SELECT IC.id
     , IC.full_name
     , IC.location
     , IC.phone_number
     , ICD.icid
     , ICD.incdid
     , ICD.date_sub
     , ICD.date_exp
     , ICD.isPaid
     , ICD.sub_price 
FROM internetClient IC
LEFT JOIN (SELECT ICDi.*
           FROM internetclientdetails ICDi
           INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID 
                       FROM internetclientdetails 
                       GROUP BY ICID) mICD
              ON ICDi.ICID = mICD.ICID
             AND ICDi.Date_Sub = mICD.MaxDateSub
           ) ICD
  on IC.id=ICD.icid 
ORDER BY ICD.incdid desc

BREAKDOWN / ОБЪЯСНЕНИЕ

Ниже приведено подмножество max (date_Sub) для каждого ICID в clientDetails.Нам нужно, чтобы мы могли отфильтровать все записи, которые не являются максимальной датой для clientID.

(SELECT max(date_sub) MaxDateSub, ICID 
 FROM internetclientdetails 
 GROUP BY ICID) mICD

Используя этот набор, мы объединяем детали Client_ID и максимальную дату, чтобы исключить все, кроме самой.последние детали для каждого клиента.Мы делаем это, потому что нам нужны другие подробные атрибуты.Это может быть сделано с помощью объединения или существует.Я предпочитаю подход к объединению, так как он кажется мне более явным.

(SELECT ICDi.*
 FROM internetclientdetails ICDi
 INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID 
             FROM internetclientdetails 
             GROUP BY ICID) mICD
    ON ICDi.ICID = mICD.ICID
   AND ICDi.Date_Sub = mICD.MaxDateSub
 ) ICD

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

КОМПОНЕНТЫ:

  • Вы хотели все записи из InternetClient (FROM internetClient IC)
  • Вы хотели связанные записи из InternetClientDetail (LEFT Join InternetClientDetail ICD) при сохранении записейот InternetClient.
  • Вы ТОЛЬКО хотели получить самую последнюю запись из InternetClientDetail (INNER JOIN InternetClientDetail mICD в качестве производной таблицы, получающей ICID и max (date))
  • Общее количество записей должно = общее количество записей в InternetClientэто означает, что все связи должны быть 1: 1 на соединениях таблицы - один к одному Необязательно.
0 голосов
/ 24 мая 2018

попробуй с левым соединением.Он будет отображать все записи из internetClient и связанные записи из internetclientdetails

Select internetClient.id, internetClient.full_name
     , internetClient.location, internetClient.phone_number
     , internetclientdetails.incdid, internetclientdetails.icid
     , internetclientdetails.date_sub, internetclientdetails.date_exp
     , internetclientdetails.isPaid, internetclientdetails.sub_price 
from internetClient 
left join internetclientdetails 
  on internetClient.id=internetclientdetails.icid group by internetclientdetails.icid order by internetclientdetails.incdid desc

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

Select internetClient.id, internetClient.full_name
     , internetClient.location, internetClient.phone_number
     , internetclientdetails.icid, internetclientdetails.incdid
     , internetclientdetails.date_sub, internetclientdetails.date_exp
     , internetclientdetails.isPaid, internetclientdetails.sub_price 
from internetClient 
left join internetclientdetails 
  on internetClient.id=internetclientdetails.icid 
 and internetclientdetails.isPaid=1 group by internetclientdetails.icid
order by internetclientdetails.incdid desc
...