【问题标题】:PHP MySQL search over 3 fields in 3 tablesPHP MySQL搜索3个表中的3个字段
【发布时间】:2013-06-16 14:21:16
【问题描述】:

我有三张桌子:乐队、演出和场地。我希望能够按乐队名称、乐队家乡和场地名称进行搜索。以下是我的表格的大致思路:

乐队

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

我显然对整个内部连接的事情很陌生......

【问题讨论】:

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


    【解决方案1】:

    你很亲密;只需进行一些调整:

    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

    【讨论】:

      【解决方案2】:

      您的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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 1970-01-01
        • 2020-07-11
        • 2021-06-07
        相关资源
        最近更新 更多