PHP MySQL搜索3个表中的3个字段

时间:2013-06-19 21:21:52

标签: php mysql search inner-join sql-like

我有三张桌子:乐队,演出和场地。我希望能够通过乐队名称,乐队故乡和场地名称进行搜索。以下是我的表格的一般概念:

频带

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

我显然对这整个内部联合事物都很陌生......

2 个答案:

答案 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