我有三张桌子:乐队,演出和场地。我希望能够通过乐队名称,乐队故乡和场地名称进行搜索。以下是我的表格的一般概念:
ID | NAME | LOCATION
------|--------------|------------
1 | Spinal Tap | New York, NY
2 | Jimi Hendrix | Woodstock, PA
ID | VENUE_ID | START_TIME | BAND_ID
------|----------------|------------------|--------------
1 | 1 | 1371171600 | 1
2 | 2 | 1371171600 | 1
3 | 1 | 1371171600 | 2
4 | 2 | 1371171600 | 1
ID | NAME
------|---------------------
1 | Madison Square Garden
2 | Jefferson Round Garden
因此,通过乐队名称和位置搜索很容易。类似的东西:
SELECT id,name,location
FROM bands
WHERE name LIKE '%$search_string%' OR location LIKE '%$search_string%'
ORDER BY name
如果我想包括按地点名称搜索的可能性怎么办?这是我可怕的拙劣尝试:
SELECT bands.id,bands.name,bands.location,venues.name
FROM bands
WHERE name LIKE '%$search_string%' OR location LIKE '%$search_string%'
INNER JOIN gigs
ON bands.id=gigs.band_id
INNER JOIN venues
ON gigs.venue_id=venues.id
WHERE start_time>'$now'
ORDER BY bands.name
我显然对这整个内部联合事物都很陌生......
答案 0 :(得分:2)
你很亲密;只需要一些调整:
SELECT
bands.id,
bands.name,
bands.location,
venues.name
FROM bands
INNER JOIN gigs ON bands.id = gigs.band_id
INNER JOIN venues ON gigs.venue_id = venues.id
WHERE start_time>'$now'
AND (
bands.name LIKE '%whatever%' OR
bands.location LIKE '%whatever%' OR
venues.name LIKE '%whatever%'
)
WHERE
中的括号非常重要,因为OR
的优先级低于AND
。
答案 1 :(得分:1)
您的JOIN
中存在错误,您应首先通过表格并加入它们并使用WHERE
条款。如你所见,我使用ALIAS
作为表,我使用前面的列名来让数据库了解表的来源。
SELECT a.id,a.name,a.location,c.name
FROM bands a
INNER JOIN gigs b
ON a.id=b.band_id
INNER JOIN venues c
ON b.venue_id=c.id
WHERE (a.name LIKE '%$search_string%' OR a.location LIKE '%$search_string%' OR C.name LIKE '%search_string%')
AND b.start_time>'$now'
ORDER BY a.name