The table’s schema is pretty simple. I have a child table that stores a customer’s information like address and phone number. The columns are user_id, fieldname, fieldvalue and fieldname. So each row will hold one item like phone number, address or email. This is to allow an unlimited number of each type of information for each customer.
The people on the phones need to look up these customers quickly as they call into our call center. I have experimented with using LIKE% and I’m working with a FULLTEXT index now. My queries work, but I want to make them more useful because if someone searches for a telephone area code like 805 that will bring up many people, and then they add the name Bill to narrow it down, ‘805 Bill’. It will show EVERY customer that has 805 OR Bill. I want it to do AND searches across multiple rows within each customer.
Currently I’m using the query below to grab the user_ids and later I do another query to fetch all the details for each user to build their complete record.
SELECT DISTINCT `user_id` FROM `user_details` WHERE MATCH (`fieldvalue`) AGAINST ('805 Bill')
Again, I want to do the above query against groups of rows that belong to a single user, but those users have to match the search keywords. What should I do?
Have you tried using
BOOLEAN MODEsearch queries?It means you have to manipulate the search query that is entered by the user. You can’t just pass it into your query verbatim; you have to add
+characters and so on.Re your comment: Any SQL predicate evaluates in the context of only one row at a time. The way to compare rows is to use a self-join:
PS: I removed
DISTINCTbecause it’s a no-op in this query and can only reduce performance.