I’ve written SELECT statement that works perfectly. However, I need to make some changes so that it now gets user submitted information from a form and returns results from the database based on that.
It will essentially be a product search—if a user searches for “red” they’ll get back all items that are red. If they search for “red” and “wood” they’ll get back only the items that are red and made of wood.
Here is my HAVING clause:
HAVING values LIKE "%Red%" AND values LIKE "%Wood%"
If I had a series of 5 drop down menus, each with a different set of terms, should I try to build the HAVING clause dynamically based on what drop downs the user uses? How would this be done?
I would opt for a static SQL statement, given that there are exactly five “options” the user can select from.
What I would do is use an empty string as the value that represents “no restriction” for a particular option, so my statement would be like this: e.g.
To apply restrictions only on options 1 and 2, and no restriction on option 3, e.g.
To apply restriction only on option 2, e.g.
This allows you to have a static statement, and the only thing that needs to change is the values supplied for the bind parameters.
It’s also possible to use a NULL value to represent “no restriction” for an option, but you’d need to modify the SQL statement to do a “no restriction” when a NULL value is supplied. Either check for the NULL value specifically, e.g.
-or- just convert the NULL to an empty string for use in the LIKE predicate, e.g.
The same technique will work with a WHERE clause as well. You may want to consider whether a WHERE clause is more appropriate in your case. (We can’t tell from the information provided.)
But note that the HAVING clause does not restrict which rows are included in the statement; rather, the HAVING clause only restricts which rows from the result set are returned. The HAVING clause is applied nearly last in the execution plan (I think its followed only by the ORDER BY and LIMIT.
The HAVING clause can apply to aggregates, which the WHERE clause cannot do. The HAVING clause can reference columns in the SELECT list, which the WHERE clause cannot do.
(Also note that VALUES is a reserved word, if it’s not qualified (preceded by
alias., it may need to be enclosed in backticks.)