SQL重复行

I have a big filter with many options and want to generate the query for sql automaticle and without many code.

GET:

searchvalue=abc
&title=abc
&description=abc
&category=1
&subcategory=2
&zip=7
&city=ke
&country=DE

SQL:

SELECT activity.* FROM activity,subcategory,city,country 
WHERE activity.title LIKE '%abc%' OR activity.description LIKE '%abc%' 
AND subcategory.SubID = 2 
AND city.zip LIKE '%7%' 
AND city.City LIKE '%ke%' 
AND country.CShort= 'DE'

With this options, I have 1 row in my database. The answer is this row many times, many many times.

I know that the sql duplicate a row, when a table is not used in a WHERE clausel - but why he do it now and how can I solve that?

Edit: I have a ER, but the database is in german (school project), maybe it help you to understand: enter image description here

Thanks!

You are doing a cross product by selecting multiple tables. SQL will return every row from the one table combined with every row in the other table.

For example in a database with table a

|------|----------|
| idA  | textA    |
|------|----------|
|   1  | fooA     |
|   2  | barA     |
|------|----------|

and table b

|------|----------|
| idB  | textB    |
|------|----------|
|   1  | fooB     |
|   2  | barB     |
|------|----------|

when you do

SELECT * FROM a, b

you would get

|------|----------|------|----------|
| idA  | textA    | idB  | textB    |
|------|----------|------|----------|
|   1  | fooA     |   1  | fooA     |
|   1  | fooA     |   2  | barA     |
|   2  | barA     |   1  | fooB     |
|   2  | barA     |   2  | barB     |
|------|----------|------|----------|

To combine these rows logically you do a JOIN. That means you tell in your query which rows belong together. You can do so by JOIN clause or without JOIN clause directly in the WHERE clause. Back to the example you would do

SELECT * FROM a, b
WHERE a.idA = b.idB

-- or

SELECT * FROM a
JOIN b ON a.idA = b.idB

you would get only 2 rows.

|------|----------|------|----------|
| idA  | textA    | idB  | textB    |
|------|----------|------|----------|
|   1  | fooA     |   1  | fooA     |
|   2  | barA     |   2  | barB     |
|------|----------|------|----------|

To answer your question: You have to support JOIN/WHERE clauses to connect your tables activity, subcategory, city and country according to your database schema.

I don't know your table structures but for example clauses like this:

WHERE
    ...
AND city.country_id = country.id
AND activity.subcategory_id = subcategory.id
AND ...