Frage MySQL-Abfrage funktioniert in PHPMyAdmin und schlägt in PHP fehl


SELECT SQL_CALC_FOUND_ROWS * 
FROM (
   SELECT * 
   FROM tbl_substances
   LIMIT 0 , 25
) AS s
LEFT JOIN (
   SELECT subid, list1, list2, list3, list4, list5
   FROM tbl_substances_lists
   WHERE orgid =  '1'
) AS x ON s.subst_id = x.subid
LEFT JOIN (
   SELECT subid, info
   FROM tbl_substances_info
   WHERE orgid =  '1'
) AS y ON s.subst_id = y.subid

Die Idee ist, dass Sie eine Master-Liste von Substanzen haben (tbl_substances). Wenn Sie Informationen über sie in tbl_substances_lists oder tbl_substances_info eingegeben haben, kann dies ebenfalls angezeigt werden (solange Sie mit der richtigen Organisations-ID angemeldet sind).

Es ist wichtig, alle Substanzen zu zeigen, auch wenn sie keine benutzerdefinierten Informationen haben, weshalb ich ein LINKES VERBINDEN benutze.

Diese Abfrage funktioniert perfekt in phpMyAdmin, aber wenn ich sie in meinem Datenbankskript verwende, bekomme ich:

Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, um die richtige Syntax für die Verwendung von near ') AS s LEFT JOIN zu verwenden (SELECT subid, list1, list2, list3, list4, list5 FROM tbl_substances_' in Zeile 2)

Ich bin nicht sicher, ob das Problem etwas offensichtlich ist, das ich vermisse, oder hat es etwas mit der Tatsache zu tun, dass dieses Bit des Codes mysql_query verwendet, von dem ich weiß, dass es veraltet und altmodisch usw. ist.

Ich bin kein Datenbankexperte, also wenn diese Frage sehr hässlich für dich aussieht, dann entschuldige ich mich im Voraus!

BEARBEITEN 2

Hier ist der Code zum Erstellen dieser Abfrage (sie wird dynamisch erstellt, je nachdem, was Sie suchen, aber dies ist die Grundform)

    /*
     * Length
     */

    if ( isset( $_POST['iDisplayStart'] ) && $_POST['iDisplayLength'] != '-1' )
    {
        $sLimit = "LIMIT ".mysql_real_escape_string( $_POST['iDisplayStart'] ).", ".
            mysql_real_escape_string( $_POST['iDisplayLength'] );
    }


    /*
     * Ordering
     */

    $sOrder = "";
    if ( isset( $_POST['iSortCol_0'] ) )
    {
        $sOrder = "ORDER BY  ";
        for ( $i=0 ; $i<intval( $_POST['iSortingCols'] ) ; $i++ )
        {
            if ( $_POST[ 'bSortable_'.intval($_POST['iSortCol_'.$i]) ] == "true" )
            {
                $iColumnIndex = array_search( $_POST['mDataProp_'.$_POST['iSortCol_'.$i]], $aColumns );
                $sOrder .= $aColumns[ $iColumnIndex ]."
                    ".mysql_real_escape_string( $_POST['sSortDir_'.$i] ) .", ";
            }
        }

        $sOrder = substr_replace( $sOrder, "", -2 );
        if ( $sOrder == "ORDER BY" )
        {
            $sOrder = "";
        }
    }

        /*
         * Table info
         */
    $sTable = "tbl_substances ".$sLimit.") AS s 
LEFT JOIN (
  SELECT subid, list1, list2, list3, list4, list5 
  FROM tbl_substances_lists 
  WHERE orgid = '".$orgid."'
) AS x 
ON s.subst_id = x.subid 
LEFT JOIN (
  SELECT subid, info 
  FROM tbl_substances_info WHERE orgid = '".$orgid."'
) AS y 
ON s.subst_id = y.subid";

        $sWhere = "";


    /*
     * SQL queries
     * Get data to display
     */

    $sQuery = "
        SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT * FROM $sTable
                $sWhere
        $sOrder
        $sLimit
    ";

        $rResult = mysql_query( $sQuery ) or die(mysql_error());

Stellen Sie sich vor, es gibt nichts in $ sWhere und $ sOrder im Moment - $ sLimit wird vom Benutzer gewählt, aber in diesem Fall ist es LIMIT 0, 25, um die ersten 25 Datensätze zu erhalten.

Dies alles kombiniert in diesem Fall, um das Ergebnis von $ sQuery herauszuholen:

SELECT SQL_CALC_FOUND_ROWS * 
FROM (
  SELECT * 
  FROM tbl_substances LIMIT 0, 25
) AS s 
LEFT JOIN (
  SELECT subid, list1, list2, list3, list4, list5 
  FROM tbl_substances_lists 
  WHERE orgid = '1'
) AS x 
ON s.subst_id = x.subid 
LEFT JOIN (
  SELECT subid, info 
  FROM tbl_substances_info 
  WHERE orgid = '1'
) AS y 
ON s.subst_id = y.subid

5
2017-12-10 15:07


Ursprung


Antworten:


Habe den Code nicht analysiert, aber abfragebedingt sehe ich keinen Syntaxfehler. Aber ich würde empfehlen, dass Sie die Abfrage so schreiben:

SELECT SQL_CALC_FOUND_ROWS * 
FROM tbl_substances s
LEFT JOIN tbl_substances_lists x ON s.subst_id = x.subid AND x.orgid = '1'
LEFT JOIN tbl_substances_info y ON s.subst_id = y.subid AND y.orgid = '1'
LIMIT 0, 25

Sollte das gleiche Ergebnis geben.


2
2017-12-10 16:54



In meinem Fall habe ich mit "ISO 8859-1 Characters" (Ç, Ã, é ....) gearbeitet, dabei: utf8_decode ($ query); löste dieses Problem.


2
2018-03-08 11:46