it-swarm.com.de

Ansichten mit Parametern, ist das möglich?

Ich arbeite in einer PHP -Anwendung und einige "komplexe" Abfragen erscheinen im Code. Aufgrund der Komplexität kann ich kein ORM verwenden und die einzige Ressource, die ich habe, ist eine einfaches SQL und PHP native MySQL-Funktionen, die ich nicht mag.

Ohne mehr hier ist eine der Abfragen, die ich in eine Ansicht konvertieren möchte:

SELECT
  COUNT(*) AS 'rec',
  CONCAT(
      IF(agreement_list.ActiveFlag, '', 'Agreement is Inactive.'),
      IF(agreement_type.ActiveFlag, '', 'Agreement Type is Inactive.'),
      IF(distributor.ActiveFlag, '', 'License Distributor is InActive.'),
      IF(agreement_distributor.ActiveFlag, '', 'Agreement Distributor is InActive.'),
      IF(customer.ActiveFlag, '', 'Customer is Inactive.'),
      IF(cf_program_level.ActiveFlag, '', 'Program Level is Inactive.')
  ) AS errormessage,
  IF((agreement_list.ActiveFlag + agreement_type.ActiveFlag + distributor.ActiveFlag + agreement_distributor.ActiveFlag + customer.ActiveFlag + cf_program_level.ActiveFlag) < 6, 1, 0 ) AS error
FROM
  license
  JOIN agreement_list ON (agreement_list.AgreementTypeID = license.AgreementTypeID AND agreement_list.CustomerSiteID = license.CustomerSiteID AND agreement_list.Source = license.Source)
  JOIN customer ON (customer.id = license.CustomerSiteID AND license.source = customer.Source)
  JOIN distributor ON (distributor.DistributorID = license.DistributorID AND license.source = distributor.Source)
  JOIN distributor AS agreement_distributor ON (agreement_distributor.DistributorID = agreement_list.DistributorID AND agreement_list.source = agreement_distributor.Source)
  JOIN agreement_type ON (agreement_type.AgreementTypeID = license.AgreementTypeID AND license.source = agreement_type.Source)
  JOIN cf_program_level ON (cf_program_level.CFProgramLevelID = '{$CFProgramLevelID}' AND license.source = cf_program_level.Source)
WHERE
  license.AgreementTypeID = '{$AgreementTypeID}'
  AND license.CustomerSiteID = '{$CustomerSiteID}'
  AND license.Source = '{$Source}'

$CFProgramLevelID, $AgreementTypeID, $CustomerSiteID, $Source kommen Parameter von PHP und das ist mein einziges Problem. Wie übergebe ich einen Parameter an eine Ansicht, wenn es möglich ist?

Ich verwende momentan MySQL 5.6.

3
ReynierPM

Scheint einfach. Erstellen Sie das VIEW ohne die letzten 5 Zeilen. Verwenden Sie dann diese 5 Zeilen, wenn Sie VIEW verwenden, als wäre es ein TABLE.

Wenn diese JOINs nicht "many: one" sind, erhalten Sie eine aufgeblasene COUNT(*).

2
Rick James

Besser noch, Sie können auf einfache Weise Parameter an Ihre Ansichten übergeben, indem Sie eine Funktion erstellen, mit der Sie Ihre Werte aus Sitzungsvariablen abrufen können.
Die Technik finden Sie unter www.stackoverflow.com/questions/14511760. Dies ist eine Kopie meiner Erstellungsfunktion, nach der Sie möglicherweise Muster erstellen möchten.

DELIMITER //

CREATE FUNCTION fn_getcase_id()    
RETURNS MEDIUMINT(11)
DETERMINISTIC NO SQL
BEGIN
# see stackoverflow.com/questions/14511760 and read ALL the info TWICE or MORE.  wh 04/13/2017
    RETURN @sv_case_id;
END//

DELIMITER ;

Sie müssen 4 ähnliche FN erstellen (eine für jede Variable).

2
Wilson Hauck

Geht nicht. Zumindest nicht direkt. Verwenden Sie eine Prozedur, die eine temporäre Tabelle auffüllt und auf die Tabelle in Ihrem Code verweist.

0
jfroebe

Eine funktionale Alternative wäre, die Ansichtsabfrage in einer Prozedur mit Parameterübergabe zu kapseln. Dies ist eine einfache Lösung, um das Problem langsamer VIEWS mit mehreren Verknüpfungsabfragen zwischen mehreren Tabellen zu verbessern.

DELIMITER ;;
CREATE PROCEDURE `SP_QUERY_VIEW_WITH_PARAMETERS`(IN p_having VARCHAR(300))
    COMMENT 'Executes the statement'
BEGIN
  SET @v_having = p_having;
  SET @v_sql=CONCAT('SELECT 
                    id    AS id_emp  ,
                    user  AS emp_name,
                    .
                    .
                    .
                    FROM table1
                    UNION ALL
                    SELECT 
                    idtifier_us    AS id_emp  ,
                    description    AS emp_name,
                    .
                    .
                    .
                    FROM table2');
SET @v_sql2 = CONCAT(@v_sql,@v_having);
  PREPARE stmt FROM @v_sql2;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END ;;
DELIMITER ;


CALL `SP_QUERY_VIEW_WITH_PARAMETERS`('having id_emp=63 and emp_name like ''VANDERLEI%'' and created_at between ''2019-05-01'' and ''2019-05-17''  ')