php mysql 해당 게시물이 있는지 확인할 때

1단계 : sql문을 쓴다.

$sql = “SELECT drawingId FROM liketable WHERE drawingId = $itemId AND user = ‘”.$username.”‘”;

2단계 : 쿼리를 보낸다.

$result = mysqli_query($conn, $sql);

3단계 : 해당 쿼리의 num_rows가 0인지 체크한다. 만약에 0이면 해당 글이 없는 것이고, 1 이상 이라면 해당 글이 있는 것이다.

if($result->num_rows == 0){

//해당 글이 없을 때 대처하는 코드
} else {

//해당 글이 있을 때 대처하는 코드

}

Advertisements

mysql 컬럼 값 1 증가시키기

mysql>update [테이블명] set [컬럼명]=[컬럼명]+1 where [조건절]
mysql>update [테이블명] set [컬럼명]=[컬럼명]+1
해당 컬럼은 숫자값이 들어 있어야 합니다.
해당 업데이트 문을 이용하여 숫자값을 증가 시킵니다.
출처 : http://www.jnetwork.kr/bbs/board.php?bo_table=useguide&wr_id=202&sfl=&stx=&sst=wr_hit&sod=desc&sop=and&page=6

mysql foreign key 에 대해

https://m.blog.naver.com/PostView.nhn?blogId=diceworld&logNo=220217471190&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

http://kb.globalsoft.co.kr/web/web_view.php?notice_no=315

cf)

Error 1022 – Can’t write; duplicate key in table

foreign 키를 추가할 때 이런 에러가 뜬다. 이 에러는 foreign키의 별명으로 설정하려는 단어가 이미 다른 foreign키의 별명으로 설정돼 있다는 뜻이다. 그러므로 별명을 바꿔주면 된다.

출처 : https://stackoverflow.com/questions/18056786/error-1022-cant-write-duplicate-key-in-table

mysql 근사치 구하는 쿼리

출처 : http://tip.daum.net/question/58814376
where 절에서 근사치로 조건문을 만드는 방법은 없을까요

 uid value1 value2 1 10데이타1
2 20데이타2 3 50데이타3 4 100 데이타4

데이타베이스 테이블에 레코드가 위와 같이 있을때 value1 필드의 값이 10 인 레코드의 uid 를 얻을려면

select uid from 테이블 where value1 = 10

이러면 될텐데 13이라는 임의의 값을 가지고

select uid from 테이블 where value1 의 값들중에 13이랑 가장 비슷한값(근사치).

이런 식으로 찾을 수 있는 방법은 없을까요?

익명|2010.06.12 02:23 수정됨|조회 1,278|신고

나도궁금답변하기
  • 글꼴조정
  • 친구에게 배달

답변 2

답변 목록

  • 답변

    쿼리 성능이 그리 좋게 나올 것 같지는 않지만.. MySQL 기준으로,

    select uid from 테이블 order by abs(value1 – 13) limit 1

    이렇게 하면 13과의 차가 가장 적은 한개를 가져오게 됩니다.

    가능하면 value1에 인덱스를 주고 연산 없이 정렬해서 어플리케이션에서 어떻게 잘 처리하는게 좋을 것 같아요..

    추천추천 0
  • 답변

    SQL>

    SQL> REM    13과의 근사치 값을 가지고 소팅을 하여 가장 작은 넘을 위로 올리는 desc 소팅을 한 후

    REM    맨 아래 쿼리에서는 한 넘만 fetch 하면 됩니다.

    WITH a_query AS

    (

    SELECT  *

    FROM    TABLE

    ORDER  BY ABS( VALUE1 – 13 )  DESC

    )

    SELECT  * FROM  a_query WHERE ROWNUM <= 1;

    SQL>

    하면 가장 근사치값 하나만 튀어 나올거 같은데요

경도, 위도를 이용해 반경내 가장 가까운 것들 구하기

출처 : https://ncube.net/7388#comment-15215

이번에 작업 중인 사이트.. 수시로 정책이 바뀌어서 고생하고 있는.. 사이트에서 반경을 이용한 업체 검색 기능이 필요해서 구글링 좀 하고 잔머리를 좀 굴려서 원하는 기능을 구현했다. 각 지점의 경도와 위도는 네이버 지도API를 이용해 얻어온다. 그런 다음 경도 위도를 DB에 저장하고 Query를 이용해 기준 반경 내 업체를 구하는 식이다.

1. 네이버 지도 API에서 경도, 위도 받아오기
우선 네이버 지도 API를 이용하기 위해서는 Key를 등록해야 한다. http://dev.naver.com/openapi/register 에 접속한다. 로그인이 되어야 정상적으로 이용할 수 있다. 그런 다음 아래 화면처럼 지도키 발급에서 사이트 주소를 입력하고 키를 발급받도록 한다.

그런 다음 경도 위도를 확인하기 위해서 아래 주소로 접속한다. test_key 부분은 위에서 발급 받은 키로 변경한다. 좌표확인URL은 아래와 같다.

더 자세한 사용법은http://dev.naver.com/openapi/apis/map/javascript_2_0/reference#CT_URL 에서 확인 가능.

아래는 결과 화면이다.

결과는 XML 포맷으로 전달되는 데 x, y 값이 우리가 원하는 값이다. XML 파싱 부분은 검색을 통해서.. ^^;

간단히 내가 사용한 XML Parser는 http://www.criticaldevelopment.net/xml/ 에서 얻을 수 있으며 파서 파일을 PHP 파일에 include 한 후 아래 코드를 이용해 XML에서 좌표를 얻어낸다.

test_key 부분은 위에서 발급받은 키로 변경해야 한다. 그리고 php 파일이 위치한 서버의 도메인과 발급받은 키의 도메인이 일치하지 않으면 실행되지 않는다. www가 붙은 도메인과 붙지 않은 도메인은 서로 다르게 인식되는 듯 하다.

2. MySQL Query를 이용해 기준 반경내 업체 검색
우선 경도 위도를 저장할 필드를 추가해줘야 한다. DATA 타입은 아래와 같이 하면 된다. 필드 명은 적당히 변경.

이제 기준점 (127.0000000, 37.0000000)에서 DB에 저장된 지점의 거리를 계산하는 Query를 작성해보자.

위의 쿼리는 TEST_TABLE에서 기준점에서 반경 5Km 이내의 id를 거리가 가까운 순서로 5개 가져오는 것이다.

참고 : http://code.google.com/intl/ko/apis/maps/articles/phpsqlsearch_v3.html

결과 값이 얻어지면 이제 원하는 기능을 하도록 코드를 작성하면 된다.

mysql Auto Increment id 값 재정렬 시

MySQL에서 데이터를 정리하다 보면 auto_increment 값의 충돌로 데이터가 입력이 되지 않는 경우가 있습니다.

이럴 경우 간단히 해결할 수 있는 방법이 있는데요. auto_increment 값을 재지정해주면 쉽게 해결됩니다.

단순히 원하는 값으로 초기화하기를 원하는 경우

ALTER TABLE `TABLENAME` AUTO_INCREMENT=XXXXXX(설정한 인덱스번호);

기존의 ROW들을 재정렬 및 셋팅하기를 원하는 경우

ALTER TABLE `TABLENAME` AUTO_INCREMENT=1;

SET @CNT = 0;

UPDATE `TABLENAME` SET `TABLENAME`.`COLUMNNAME` = @CNT:=@CNT+1;

출처 : http://blog.naver.com/PostView.nhn?blogId=jujac&logNo=220096489653&parentCategoryNo=&categoryNo=10&viewDate=&isShowPopularPosts=true&from=search

mysql select문 예시

select [destinct] 테이블명 {, 테이블명} * from  필드명 {. 필드명} * [where 검색조건] [order by 필드명 [asc or desc] {, 필드명 [asc or desc]} *] [group by 필드명 {, 필드명} *] [having  검색조건] ;

1. 일반적 검색
mysql>  select name, id  from uncle where level=’a’ ;
=> uncle 테이블에 level이 a인 데이터의 name, id을 보여준다.

mysql>  select * from uncle;
=> uncle 테이블에 있는 모든 데이터를 보여준다.

2. 결과 레코드의 중복 제거
mysql>  select distinct level from uncle;
=> uncle 데이블에 level의 종류가 몇개인지 알수가 있다.

3. 조건검색
mysql>  select name, id from uncle where age > 20 and level = ‘a’;
=> uncle 데이블에 age가 20보다 크고 level 이 a인 name, id을 보여준다.
(검색조건을 표시하는 where절에는 비교연산자 > , >=, <, <=, = 와 논리연산자 and, or, not 을 사용할수 있다.

4. 검색 결과의 정렬
mysql>  select name, id from uncle where age > 20 order by level desc;
=> uncle 데이블에 age가 20보다  큰 name, id을 level 내림차순으로 보여준다.
(asc 는 오름차순, desc는 내림차순 asc나 desc가 없이 order by만 쓴다면 기본값 asc로 설정된다.)

5. 검색 결과에 대한 산술 계산 및 문자열 처리
mysql>  select name, ‘님의 아이디는’, id, ‘입니다.’  from uncle where age > 20 order by level ;
=> uncle 데이블에 age가 20보다  큰 name, id을 level 오림차순으로 보여준다.
결과는 ‘ name 님의 아이디는 id 입니다. ‘ 이렇게 보인다.

mysql>  select name, age+5  from uncle where id = ‘uncle’ ;
=> uncle 데이블에 id가 uncle 인 레코드의 name, 원래 age보다 +5 해서 결과를 보여준다.

6. 그룹함수(group function)를 이용한 검색
mysql>  select count(*)  from uncle where level = ‘a’ ;
=> uncle 데이블에 level 이 a을 만족하는 레코드 결과를 보여준다.
* count(필드명) : 조건을 만족하는 레코드의 개수
* sum(필드명)  : 해당 필드의 합
* min(필드명)    : 해당 필드의 최대값
* max(필드명)  : 해당 필드의 최소값
* avg(필드명)    : 해당 필드의 평균값

7. group by를 이용한 검색
mysql>  select level max(age), min(age), avg(age) from uncle group by level ;
=> uncle 데이블에 level 과 최대 age값, 최소 age값, 평균 age 값을 level 별로 결과를 보여준다.

8. having을 이용한 검색
mysql>  select level max(age), min(age), avg(age) from uncle group by level having level = ‘a’ ;
=> uncle 데이블에 level 과 최대 age값, 최소 age값, 평균 age 값을 level a의 결과만 보여준다.
(having문은 group by에서 지정한 필드에 대한 검색 조건문이다.)

9. between  연산자를 이용한 검색
mysql>  select name, id from uncle where level = ‘a’ and age between 20 and 25 ;
=> uncle 데이블에 age가 20 ~ 25 이고 level 이 a 인 레코드의 name, id 을 보여준다.
* mysql>  select name, id from uncle where level = ‘a’ and age >= 20 and  age <=25 ; 와 같다.

mysql>  select name, id from uncle where level in (‘a’, ‘b’) ;
=> uncle 데이블에 level이 a, b 인 name, id을 보여준다.

mysql>  select name, id from uncle where level not in (‘a’, ‘b’) ;
=> uncle 데이블에 level이 a, b 을 제외한 name, id을 보여준다.

10. like을 이용한 검색
mysql>  select name, id from uncle where name like ‘%용%’ ;
=> uncle 데이블에 name에 ‘용’ 포함되어 있는 name, id을 보여준다.
(‘%용’ 이면 용으로 끝나는 레코드를 ‘용%’이면 용으로 시작하는 레코드를 보여준다.)

11. null 값을 이용한 검색
mysql>  select name, id from uncle where level is null ;
=> uncle 데이블에 level 값이 null 인 name, id을 보여준다.

출처 : http://www.unclecho.com/bbs/board.php?bo_table=mysql&wr_id=7