2015-01-13 4 views
-1

Я пытаюсь показать некоторые записи из таблицы, а если не существует, чтобы показать кнопку create new. Если существует, чтобы показать запись.Соединение двух таблиц и проверка наличия записи

Есть две таблицы - users

user_id 
username 
... 

И restaurants

rest_id 
name 
menu 

Таким образом, после пользователь создан и он войти в его счет должен иметь состояние, если user_id есть ресторан user_id = menu (меню из ресторанов) , Если в меню show show создать не существует. Это запрос, с помощью которого я пытаюсь

$q = $pdo->prepare("SELECT * FROM restaurants m     
      LEFT JOIN users ON users.user_id = m.menu WHERE rest_id = :user_id"); 

       $q->bindParam(':user_id', $_SESSION['user_id']); 
       $q->execute(); 
       // fetch the results 
       $results = $q->fetchAll(PDO::FETCH_ASSOC); 
       if(count($results) > 0) { 
        foreach($results as $res) { 
         echo '<a href="users/restaurant.php?rest_id='. $res['rest_id'] .'"> '.$res['name'].' </a>'; 
        } 
       } else { 
         echo '<a href="users/restAdd.php?rest_id='.$_SESSION['user_id'].'">Create New</a>'; 
       } 

Таким образом, когда пользователь Логин он кнопку Create New увидеть, потому что он не один. Проблема в том, что он снова регистрируется после того, как он уже создал запись ... кнопка Create New снова виден.

У меня проблема в запросе или нет?

ОБНОВЛЕНИЕ: menu строка hold user_id из сеанса, когда он создает новый. Это в restAdd.php

$sql = "INSERT INTO restaurants (name, menu, image) VALUE (:name, :menu, :image)"; 
        $q = $pdo->prepare($sql); 
       $q->execute(array(
       ':name'  => $name, 
       ':menu'  => $_SESSION['user_id'], 
       ':image' => $forDB 
       )); 
+0

Проверьте снова запрос, «users.user_id = m.menu» ??? Это верно? Если да, объясните пожалуйста – vivoconunxino

+0

Ну, не нужно ли мне проверять соединение user_id с «пользователями» и меню из «ресторанов»? –

+0

Pro tip: Не используйте 'SELECT *' специально в 'JOIN' запросах. Вместо этого перечислите нужные столбцы. Кроме того, мы не можем сказать из вашего вопроса, как точно каждая строка в таблице ваших ресторанов относится к строке в вашей таблице 'users'. Вы можете объяснить? –

ответ

1

Попробуйте с этим запросом:

SELECT m.rest_id, m.name FROM restaurants m     
    INNER JOIN users ON users.user_id = m.menu 
    WHERE menu = :user_id 

1) INNER JOIN вместо LEFT, вы хотите проверить, есть ли рестораны, связанные с пользователем.

2) Я думаю, что вы сделали маленькую ошибку, поле меню, содержащим пользовательский идентификатор

+0

Спасибо за помощь. Думаю, мне нужно узнать различия между объединениями «ВЛЕВО», «ВПРАВО», «ИННЕР» и «ВТОР». –

+1

Добро пожаловать. Вот один из моих любимых ответов SO, проверьте это. http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins – vivoconunxino

+0

Спасибо. Я проверю его. –

-1

В этом случае вам нужно в вашем где п menu = :user_id не rest_id = :user_id Попробуйте с этим:

SELECT * FROM restaurants m     
    LEFT JOIN users ON users.user_id = m.menu WHERE menu = :user_id" 
Смежные вопросы