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
物質のマスター リスト (tbl_substances) があり、それらに関する情報を tbl_substances_lists または tbl_substances_info に入力した場合は、それも表示できます (正しい組織 ID でログインしている場合)。
カスタム情報がない場合でも、すべての物質を表示することが重要であるため、LEFT JOIN を使用しています。
このクエリは phpMyAdmin で完全に機能しますが、データベース スクリプトで使用すると次のようになります。
SQL 構文にエラーがあります。2行目のnear ') AS s LEFT JOIN (SELECT subid, list1, list2, list3, list4, list5 FROM tbl_substances_' を使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。
問題が私が見逃している明らかなものなのか、それともこのコードが非推奨で古風なものであることがわかっている mysql_query を使用しているという事実と関係があるのか どうかはわかりません.
私はデータベースの専門家ではないので、このクエリが非常に見苦しく思われる場合は、あらかじめお詫び申し上げます。
編集2
このクエリを構築するためのコードは次のとおりです (検索対象に応じて動的に構築されますが、これが基本的な形式です)。
/*
* 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());
現時点で $sWhere と $sOrder に何もないと想像してください。$sLimit はユーザーが選択しますが、この場合、最初の 25 レコードを取得するには LIMIT 0, 25 になります。
この場合、これはすべて組み合わされて、$sQuery をエコーアウトした結果になります。
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