I am trying to build an SQL query on an omekaS database to extract books with a specific title and date.
In this system, the table holding the values is called value
, and the relevant attributes are as so :
value -id (pk) -resource_id -type (int) -value
The resource_Id
is the identifier through the db
Value is one field; like the book “Moby Dick” written in 1822 (random date) would look like this in db. Type tells us what is it (arbitrarily, 1
is titles and 2
is publishing year)
Id | resource_id | type | value |
---|---|---|---|
1 | 1 | 1 | Moby dick |
2 | 1 | 2 | 1822 |
I need to take all books with a certain title, published in a set of years
Basically
Select all the columns from value Where value is a title and of type title And value is in a set of years And with all these having the same resource_id
I get lost, and I have no idea how to do this.
What would be the best way?
Thanks
Advertisement
Answer
If you need to check more types, you can check with AND EXISTS (SELECT 1 FROM ...WHERE type = 3 AND ...)
if the conditions are met
I renemd the table name, it is confusing to use cloumn names and table names with identical names.
CREATE TABLE books ( `Id` INTEGER, `resource_id` INTEGER, `type` INTEGER, `value` VARCHAR(20) ); INSERT INTO books (`Id`, `resource_id`, `type`, `value`) VALUES ('1', '1', '1', 'Moby Dick'), ('2', '1', '2', '1822');
SELECT `resource_id`, `value` FROM books WHERE `type` = 1 AND `resource_id` IN (SELECT `resource_id` FROM books WHERE `type`= 2 AND `value` IN ('1822','1984'))resource_id | value ----------: | :-------- 1 | Moby Dick
db<>fiddle here
And if you want to have them in a row
SELECT b1.`resource_id`, b1.`value` , b2.`value` FROM books b1 INNER JOIN books b2 ON b1.`resource_id` = b2.`resource_id` and b2.`type`= 2 WHERE b1. `type` = 1 ANd b1.`resource_id` IN (SELECT `resource_id` FROM books WHERE `type`= 2 AND `value` IN ('1822','1984'))resource_id | value | value ----------: | :-------- | :---- 1 | Moby Dick | 1822
db<>fiddle here