Обьединение таблиц
1.
Erika (22.03.2013 / 18:36)
Привет всем)
У меня неожиданно возникла запара. Дело в том, что у меня есть 2 таблицы. 1 - таблица гостей, 2 - таблица забанённых гостей. Пишу скрипт который выводит гостей по категориям.
1. all - выводит всех гостей
2. b - выводит гостей забанённых по IP
3. n - выводит законопослушных гостей
Я бы могла создать несколько страниц, в которой было бы по отдельному запросу к нужной на момент использования таблице. Но такой подход мне не особо нравится.
Потому я пошла как говорится, другим путём.
<?php
$sql = '';
$sql.= "SELECT * FROM `ac_guest`, `ac_guest_ban` ";
# Все гости
if($cat == 'b')
$sql.= "WHERE `ac_guest`.`id` = `ac_guest`.`id_user`";
# Забанённые по ip
elseif($cat == 'n')
$sql.= "WHERE `ac_guest`.`id` <> `ac_guest`.`id_user` ";
# Не нарушавшие гости
$sql.= "GROUP BY `ip` ";
# Только уникальные IP
?>
Но суть сего сказания заключается в том, что пока в таблице `ac_guest_ban` (забанённіе по IP) хотя бы одна запись - скрипт не возвращает ни одного результата.
Как решить данную задачу - неиму. Если кто в курсе как, мне справится с этим - пожалуйста подскажите. За ранее Вам благодарна, с уважением Я
PS
Во избежания тупорылых постов "Гугл тебе в помощ" и тд и тп, отвечу так - трафа меня нет и скорость 320 кбит/сек
2.
Erika (22.03.2013 / 20:09)
<?php
$sql = '';
$sql.= "SELECT * FROM `ac_guest`, `ac_guest_ban` ";
# Все гости
if($cat == 'b')
$sql.= "WHERE `ac_guest`.`id` = `ac_guest_ban`.`id_user`";
# Забанённые по ip
elseif($cat == 'n')
$sql.= "WHERE `ac_guest`.`id` <> `ac_guest_ban`.`id_user` ";
# Не нарушавшие гости
$sql.= "GROUP BY `ip` ";
# Только уникальные IP
?>
Прошу прощения, премер выше не катит. В этом посте реально правильный пример. Что в нём не так, подскажите кто в курсе...
3.
shilo (22.03.2013 / 21:10)
Не проще уж прописать полные запросы? не вижу смысла в этой мозаике
4.
Erika (22.03.2013 / 21:33)
3.
shilo, что ты имеешь в виду?
Проще никак не получится. Я же ранее уже говорила, что в принципе можно создать три страницы одного раздела но мне это не с руки. Хотелось бы все вместить в одно предложение.
Во первых это меньше кода, а значить и головняка лишнего нет. Во вторых SQL дуплится на много шустрее php. По этому все, что можно решить с помощью SQL лучше всего именно так и решать. При большом потоке посетителей меньше вероятности, что движок начнет тупить, а у меня он достаточно тяжелый. Меньше нагрузки всегда лучше.
5.
Петр (26.03.2013 / 12:52)
Во-первых, смысла в разбиении SQL запросов нет. Это "экономия на спичках", с другой стороны, разбираться в таком коде несколько сложнее. Во-вторых, запросы из нескольких таблиц работают следующим образом - можно сказать, "первоначально" возвращаются все возможные комбинации из записей обеих таблиц. Поэтому, третий тип запроса должен быть примерно таким:
SELECT * FROM `ac_guest`
LEFT JOIN `ac_guest_ban` ON `ac_guest`.`id` = `ac_guest`.`id_user`
WHERE `ac_guest`.`id_user` IS NULL
URL:
https://visavi.net/topics/37212