2017-05-02 20 views
-1

私はこのようなクエリを持っています。現在、非常にシンプルでしまでMySQLのクエリ絞り込み

$stmt = $conn->prepare("SELECT * FROM database.table WHERE (`status` = 'red' OR `status` = 'orange') ORDER BY `$orderby` $ad"); 

$のORDERBYの側面は、アップ持っている - テーブルから列名を選択して注文することを使用結果。これまでのオプションがlastModifiedreference

のようなものだった私が、うるさく、あるallocationという名前の、潜在的な選択肢として、このに追加フィールドを追加するために、2つの情報の部分とを1つだけ保持するフィールドを依頼されていますこれらは実際にオーダーごとに必要です。そのようなオプションは、nullまたは書式:16/02/2017 - Sydneyまたは19/05/2017 - New Yorkなどのいずれかです。

dd/mm/yyyyの形式の日付で注文することはできますが、質問内では- Locationのものを捨てることができますか?私はPHPでそれを行う方法を知っていますが、直接MySQLのクエリではありません。それも可能ですか?私はそれが何とかしていると推測しています...(希望)!

+0

スペースを見つけるのに 'LOCATE()'を使い、その位置まで全てを取得するには 'LEFT()'を使います。 – Barmar

+1

**警告**:可能な限り、**プリペアドステートメント**を使用して、クエリに任意のデータを注入したり、[SQLインジェクションのバグ](http://bobby-tables.com/)を作成しないようにしてください。これらは[mysqli](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と[PDO](http://php.net/manual/)で行うのはかなり簡単です。 en/pdo.prepared-statements.php)ここで、ユーザが提供するデータは '?'または ':name'のインジケータで指定され、後で' bind_param'や 'execute'を使ってデータを入力します。 – tadman

+0

上記の両方のコメントは正しいですが、Barmarのアプローチが難しい場合は、ORMを取得してください。 ORMを使用しない場合、Tadmanのコメントは重要です。 –

答えて

1

LOCATE()は、最初の空白文字の位置を返します。LEFT(str, n)は、strの最初のn文字を返します。

ORDER BY LEFT(allocation, LOCATE(allocation, ' ')-1) 

ただし、あなたの日付は注文に適していません。 16/02/201718/01/2017の前に注文します。 STR_TO_DATE()を使用して、これを日付に解析し、次にそれを順序付けることができます。

+0

Thak you Barmar、私が扱っているシステムは遺産なので、私はそれ以前にそれについて正しいかどうかを制御することはできません。最初のデータ構造を整理して整理することができるまで、あなたのソリューションは機能しているようです。 – Cassandra

関連する問題