On 1/29/06 12:28 AM, Mark D. Anderson wrote:
> Thanks John. Now what about multi-keyword search?
> I would want to get all Foo rows that appear in the FooKeyword
> table with *all* supplied terms, not just "any", which is what
> I'd get with keyword => ['tra', 'pla'].
> The desired SQL would be something like this I guess:
>
> SELECT t1.* FROM foo t1, foo_keywords t2, foo_keywords t3
> WHERE
> t2.keyword = 'tra' AND t1.id = t2.foo_id AND
> t3.keyword = 'pla' AND t1.id = t3.foo_id
I was about to suggest using the "clauses" escape-hatch parameter for adding
literal SQL to the WHERE clause, but then I realized that this should work:
$foos =
Foo::Manager->get_foos(
distinct => 1,
require_objects => [ 'keywords', 'keywords' ],
query =>
[
't2.keyword' => 'kw a',
't3.keyword' => 'kw b',
]);
And sure enough, it does, producing this SQL:
SELECT DISTINCT
t1.id,
t1.name,
..rest of the columns from the foo table only...
FROM
foos t1,
foo_keywords t2,
foo_keywords t3
WHERE
t2.keyword = 'kw a' AND
t3.keyword = 'kw b' AND
t1.id = t2.foo_id AND
t1.id = t3.foo_id
If you prefer the EXISTS approach, there's currently no abstract syntax for
that. As I said, you'd have to use the "clauses" parameter.
$foos =
Foo::Manager->get_foos(
clauses =>
[
'EXISTS (SELECT * FROM foo_keywords WHERE ' .
'foo_keywords.foo_id = foo.id AND keyword = "tra")',
'EXISTS (SELECT * FROM foo_keywords WHERE ' .
'foo_keywords.foo_id = foo.id AND keyword = "pla")',
]);
Which would produce this SQL:
SELECT
id,
name
FROM
foos
WHERE
EXISTS (SELECT * FROM foo_keywords WHERE foo_keywords.foo_id = foo.id
AND keyword = "tra") AND
EXISTS (SELECT * FROM foo_keywords WHERE foo_keywords.foo_id = foo.id
AND keyword = "pla")
Unfortunately, some databases do not support the EXISTS keyword. (MySQL,
for example.)
-John
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
Rose-db-object mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rose-db-object